⚠️由于自己的拖延症,3.4.3翻到一半,OpenCV发布了4.0.0了正式版,所以接下来是按照4.0.0翻译的。

⚠️除了版本之外,其他还是照旧,Histograms in OpenCV,附原文。这篇比较特殊,有多个小节组成,我把它们合在一起了。

直方图-1:查找,绘图,分析!!!

目标

学会

  • 使用OpenCV以及Numpy的函数找出直方图。
  • 使用OpenCV以及Numpy的函数绘制直方图。
  • 你会遇到这些方法:cv.calcHist()np.histogram()等等。

理论

什么是直方图?你可以把直方图认为是一条曲线或者图表。它让你对图像的强度分布有一个整体的概念。它是一个用X轴作为像素值(区间从0到255,偶尔有例外),而用这个像素值对应的像素点的个数来作为Y轴的图表。

这只是理解图像的另一种方式。通过看图像的直方图,你可以直观地了解图像的对比度、亮度、强度分布等。当今几乎所有的图像处理工具,都提供了直方图的特性。下面是从彩色剑桥网站弄到的图片。我建议您访问该网站了解更多细节。

你可以看到这张图像以及它的直方图。(记住这张图像是为灰度图像画的,而不是彩色图像)。左侧的区域表示了图像中更暗的像素点的数量,而右侧的区域则显示了那些更亮的像素点的数量。从直方图上,你可以看到较暗的区域比较亮的区域更多,而处于中间调(像素点的值属于中间区域,比如127)的像素点数量非常少。

找出直方图

现在我们已经对什么是直方图这点有一点概念了,我们可以继续看看如何算出它。无论 OpenCV 还是 Numpy 都自带成型的方法来做这件事。在使用这些函数之前,我们需要了解一些与直方图相关的术语。

BINS(抽屉):上面的直方图为每个像素数值显示了像素点的个数,就是说从 0 到 255。意思就是说你需要256个数值来展示出上面这个直方图。但考虑一下,如果你并不是想知道每一个像素值对应的像素点数量,而是一个像素区间的像素数量呢?举个例子说,你需要知道的是像素值处于0 到 15,然后是 16 到 31,…,240 到 255 的数量。你将会需要16个数值来表示这个直方图。那就是OpenCV直方图教程里给出的示例所展示的内容。

所以,你要做的事情就是,把刚才那整个直方图分成16个子部分,而每个子部分的数值就是把子部分的全部像素的数值相加。这每一个子部分就叫做一个“BIN(抽屉)”。在最初的情况下,一共有256个抽屉(每个抽屉装一个像素),而在第二种情况下,只有16个。BINS 在OpenCV的文档中通过术语 histSize 来表示。

DIMS(维度):它是我们收集数据的参数的数量。在当前情况下,我们只收集关于强度的数据,所以这里是1。

RANGE(范围):它是你想要测量的强度范围,通常的,它是[0,256],也就是全部强度数值。

1. OpenCV中的直方图计算

现在我们使用 cv.calcHist() 函数来找出直方图。要找出直方图,让我们熟悉这个函数和他的参数:

cv.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]])

  1. images : 它是uint8或float32类型的原图。它应该用方括号表示,即“[img]”。
  2. channels : 它也在方括号中给出。它是我们计算直方图的通道索引。例如,如果输入的是灰度图像,则其值为[0]。对于彩色图像,可以通过[0]、[1]或[2]分别计算蓝色通道、绿色通道和红色通道的直方图。
  3. mask : 遮罩图像,要找出完整图像的直方图,就把这个参数设为"None"。但如果你想要找出图像一部分的直方图的话,你必须创建一个遮罩图像,并且把它当做参数传入。(稍后我会展示一个例子。)
  4. histSize : 这代表了我们抽屉的数量。需要在方括号中给出,如果要取全量,我们传入[256]。
  5. ranges : 这是我们的区域。通常来说是[0,256]。

让我们从一个简单的图像开始吧,简单的以灰度模式加载一张图像,然后找出它完整的直方图。

img = cv.imread('home.jpg',0)
hist = cv.calcHist([img],[0],None,[256],[0,256])

hist 是一个256x1数组,每一个值对应了在那个图像里有着对应像素值的像素点的数量。

2. 在Numpy里计算直方图

Numpy也为你提供了一个函数,np.histogram()。因此代替 calcHist() 函数,你可以试下这行代码:

hist,bins = np.histogram(img.ravel(),256,[0,256])

hist 是和我们之前计算的结果一样。但 bins 对象将会有257个元素,因为Numpy计算抽屉,是按0-0.99,1-1.99,2-2.99等等这么算的。所以最后的一段区间就会是255-255.99。为了表示这个,他们还在抽屉的末尾加上256。但是我们不需要256。达到255就足够(展示一张直方图)了。

再看看这个

Numpy还有另外一个函数,np.bincount() 这函数比起np.histogram()快多了(大概10倍速)。所以对于一维直方图,你最好试下它。别忘记在np.bincount函数中设置 minlength = 256。比如 hist = np.bincount(img.ravel(),minlength=256)。

提示

OpenCV 函数比 np.histogram() 要快(大约40倍)。所以坚持使用OpenCV的函数。

现在我们要来绘制直方图了,怎么绘制呢?

绘制直方图

有两种方法达到这个目的,

  1. 简单方法:使用Matplotlib绘图函数
  2. 复杂方法:使用OpenCV绘图函数

1. 用Matplotlib

Matplotlib自带了一个直方图绘图函数:matplotlib.pyplot.hist()

它直接找出直方图,然后绘制它。你不需要使用 calcHist() 或者 np.histogram() 函数来找这个直方图。看下面的代码:

import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
img = cv.imread('home.jpg',0)
plt.hist(img.ravel(),256,[0,256]);
plt.show()

你会得到以下的图像:

或者,你可以使用matplotlib里普通的画法,对绘制彩图来说,这是更好的选择。为此,您需要首先找到直方图数据。尝试下面代码:

import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
img = cv.imread('home.jpg')
color = ('b','g','r')
for i,col in enumerate(color):histr = cv.calcHist([img],[i],None,[256],[0,256])plt.plot(histr,color = col)plt.xlim([0,256])
plt.show()

结果:

你可以从上图推测出,蓝色在原图中有一些高数值区域(显然的它应该归功于原图上的天空)。

2. 使用OpenCV

在这里,你调整通过调整bin(抽屉)的数值来改变直方图的数值,让数据看起来好像 x,y 坐标轴,然后用 cv.line() 来画出它或者用 cv.polyline() 函数来生成上面那样的图像。这个在 OpenCV-Python2 官方示例中已经是可用的了。在目录samples/python/hist.py查看代码。

遮罩层的应用

我们使用 cv.calcHist() 来找出完整图像的直方图。如果你想要找出图像某一区域的直方图呢?只要创建一个遮罩图像,用白色盖住你想要获取直方图的部分,其他用黑色就可以了。然后把这个图像作为mask参数传入。

img = cv.imread('home.jpg',0)
# create a mask
mask = np.zeros(img.shape[:2], np.uint8)
mask[100:300, 100:400] = 255
masked_img = cv.bitwise_and(img,img,mask = mask)
# Calculate histogram with mask and without mask
# Check third argument for mask
hist_full = cv.calcHist([img],[0],None,[256],[0,256])
hist_mask = cv.calcHist([img],[0],mask,[256],[0,256])
plt.subplot(221), plt.imshow(img, 'gray')
plt.subplot(222), plt.imshow(mask,'gray')
plt.subplot(223), plt.imshow(masked_img, 'gray')
plt.subplot(224), plt.plot(hist_full), plt.plot(hist_mask)
plt.xlim([0,256])
plt.show()

看结果,在这次直方图的绘制中,蓝色的线条显示了完整图像的直方图,而绿色的线条显示了加入遮罩层后对于区域的直方图。

额外资源

  • 彩色剑桥网站

练习

直方图-2:直方图均衡

目标

在这一节,

  • 我们会学到直方图均衡的概念,并且用它来提升你图像的对比度。

理论

想象一幅图像,它的像素值就挤在某些特定的区间里。比如说,明亮的图像会导致所有的像素点都挤在高数值区域。但一张好图像应该有来自所有值区域的像素。所以你需要拉伸这张直方图到两个端点(如来自wikipedia的下图给出的这样)这就是直方图均衡在做的事情(简单来说)。这通常会提高图像的对比度。

我推荐你来读一下wikipedia的网页 Histogram Equalization 来了解关于它更多的细节。它通过计算出结果的例子给出了一个很好的解释。你在阅读之后几乎就能全部明白了。相反,这里我们将看到它的Numpy实现。之后,我们再用OpenCV函数。

import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
img = cv.imread('wiki.jpg',0)
hist,bins = np.histogram(img.flatten(),256,[0,256])
cdf = hist.cumsum()
cdf_normalized = cdf * float(hist.max()) / cdf.max()
plt.plot(cdf_normalized, color = 'b')
plt.hist(img.flatten(),256,[0,256], color = 'r')
plt.xlim([0,256])
plt.legend(('cdf','histogram'), loc = 'upper left')
plt.show()

你可以看到直方图位于较亮的区域。我们需要全频谱。为此,我们需要一个映射函数,它将明亮区域的输入像素映射成完整区域的输出像素。直方图均衡就是这么玩的。

现在我们找到最小的直方图数值(包括0),然后应用wiki页面给出的直方图均衡等式。这里我用到了,来自Numpy的概念,遮罩数组。对于遮罩数组,所有操作都在非遮罩元素上执行。你可以从Numpy文档上读到更多,关于遮罩数组的情况。

cdf_m = np.ma.masked_equal(cdf,0)
cdf_m = (cdf_m - cdf_m.min())*255/(cdf_m.max()-cdf_m.min())
cdf = np.ma.filled(cdf_m,0).astype('uint8')

现在我们已经拿到了给我们“所有输入像素值对应的输出值是什么”这个信息的表格。然后我们只要应用这个映射就可以了。

img2 = cdf[img]

现在我们来计算cdf(这张映射之后的新图像)和它的直方图,像之前那样(你自己做),然后结果看起来如下:

另外一个重要的特征是,即使图像是一个更暗的图像(代替了我们使用的更明亮的这张),在均衡化之后我们会得到几乎一样的结果。了解这个结果,直方图均衡化这会被作为一个“参考工具”来使用,它使得所有的图像都被做成有相同的光照条件。这在许多情况下都是非常有用的。比方说,在人脸识别时,在面部数据进行训练之前,对人脸图像进行直方图均衡化,使其具有相同的光照条件。

OpenCV里的直方图均衡

OpenCV 有个函数来做这件事,cv.equalizeHist()。它的输入只能是灰度图像,而输出则是我们经过直方图均衡化之后的图像。

下面是一个简单的代码片段,对我们之前用过的那张图片展示了函数的用法。

img = cv.imread('wiki.jpg',0)
equ = cv.equalizeHist(img)
res = np.hstack((img,equ)) #stacking images side-by-side
cv.imwrite('res.png',res)

所以现在你可以在不同的光照条件下拍摄不同的图像,然后使用直方图均衡化并检查结果。

当直方图挤在一个特定的区域时,直方图均衡化是一种很好的方法。而在强度突变的区域,直方图覆盖了大量面积的地方,这方法就不那么好使了(即亮像素和暗像素都存在)。请在额外资源中查看SOF链接。

有限对比度自适应的直方图均衡(CLAHE (Contrast Limited Adaptive Histogram Equalization))

我们刚看到了第一种直方图均衡,考虑图像的全局对比度。而在很多情况下,那就不是个好主意。比方说,以下图像显示了一张输入图像,以及它通过这种全局直方图均衡之后的结果。

直方图均衡化后的背景对比度确实有所提高。但是比较这两幅图中雕像的脸,由于亮度过高,我们丢失了大部分信息。原因就是因为它的直方图并不只是像我们之前遇到的的情况那样,挤在一个特定的区间(尝试绘制输入图像的直方图,你会更直观的了解到这件事)。

所以,为了解决这个问题,我们就要用自适应直方图均衡化。在此,图像被分割成很多小块,我们管它们叫"瓦片"(在OpenCV里瓦片的大小默认是8x8)。然后它们每一块瓦片都按照平常那样做直方图均衡。因此在一个小区域内,直方图会挤在一个小区域内(除非有噪音)。如果存在噪音的画,噪音会被放大。为了避免这件事,我们就采用对比度限制。在应用直方图均衡化之前,如果任何的直方图抽屉在指定的对比度限制之上的话(在OpenCV里默认是40),那些像素点就会被丢弃并且平均分配到其他抽屉里去。而在均衡之后,为了除去瓦片边框上的瑕疵,应用双线性插值。(译者附:双线性插值)

下面的代码片段显示了如何在OpenCV中应用CLAHE:

import numpy as np
import cv2 as cv
img = cv.imread('tsukuba_l.png',0)
# create a CLAHE object (Arguments are optional).
clahe = cv.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
cl1 = clahe.apply(img)
cv.imwrite('clahe_2.jpg',cl1)

看看以下的结果,然后和之前的做个对比,特别是雕像的那部分:

额外资源

  1. Wikipedia 的页面关于直方图均衡化
  2. Numpy里的遮罩数组

也查看一下那些SOF(译者注:SOF国外知名技术网站,https://stackoverflow.com)上的,关于对比度调整的问题:

  1. 如何用C语言调整OpenCV中的对比度?
  2. 如何用OpenCV均衡化对比度和亮度?

练习

直方图-3:2D直方图

目标

在这个章节,我们会学找到并且绘制2D直方图。它在将来的章节里很有帮助。

介绍

在第一篇文章里,我们计算并且绘制了一维的直方图。之所以它叫一维,是因为我们只考虑了一个特征,那就是像素点的灰度值。但在二维直方图中,你得考虑两个特征,通常来说它是用来获取彩色直方图,而它的两个特征是每个像素点的色调和饱和度。

这已经有个获取彩色直方图的python的示例 (samples/python/color_histogram.py)。我们会尝试理解如何创建一个这样的彩色直方图,而且它对于我们理解接下来的主题,比如直方图反映射也非常有帮助。

OpenCV里的2D直方图

它的计算非常简单,用的是同一个方法,cv.calcHist()。对于彩色直方图,我们需要把图像从 BGR 转成 HSV。(记住对于一维直方图,我们是把 BGR 转成灰度图像)。对于二维直方图,它的参数被修改成如下:

  • channels = [0,1] 因为我们需要同时处理H和S平面(译者注:分别表示H色调和S饱和度)。
  • bins = [180,256] H平面最多180个抽屉,S平面最多256个抽屉。
  • range = [0,180,0,256] 色调值落在 0 到 180 & 饱和度落在 0 到 256。

现在看看以下代码:

import numpy as np
import cv2 as cv
img = cv.imread('home.jpg')
hsv = cv.cvtColor(img,cv.COLOR_BGR2HSV)
hist = cv.calcHist([hsv], [0, 1], None, [180, 256], [0, 180, 0, 256])

搞定。

Numpy里的2D直方图

Numpy也为此提供了一个特定的函数:np.histogram2d()。(记住,一维直方图我们曾经用过np.histogram())。

import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
img = cv.imread('home.jpg')
hsv = cv.cvtColor(img,cv.COLOR_BGR2HSV)
hist, xbins, ybins = np.histogram2d(h.ravel(),s.ravel(),[180,256],[[0,180],[0,256]])

第一个参数是H平面,第二个参数是S平面,第三个参数是各自抽屉的数量,第四个参数是它们的范围。

现在我们来看看如何绘制这个彩色直方图。

绘制二维直方图

方法 - 1 : 使用 cv.imshow()

我们拿到的结果是一个二维数组,大小 180x256。所以我们可以像往常一样显示它们,使用cv.imshow()函数。它将是一个灰度图像,它不会直观的显示出那具体是什么颜色,除非你知道不同颜色的色调值。

方法 - 2 : 使用 Matplotlib

我们可以使用 matplotlib.pyplot.imshow() 函数,通过不同的颜色映射关系来绘制2D直方图。它让我们对不同的像素密度有了更好的了解。但这也不能在第一时间告诉我们那颜色是什么,除非你知道不同颜色的色调值。但我还是推荐这种方法。它很简单,而且更好。

提示

当使用这个函数时,记住,插补标记interpolation应该是最近的,以便获得更好的结果。

参考代码:

import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
img = cv.imread('home.jpg')
hsv = cv.cvtColor(img,cv.COLOR_BGR2HSV)
hist = cv.calcHist( [hsv], [0, 1], None, [180, 256], [0, 180, 0, 256] )
plt.imshow(hist,interpolation = 'nearest')
plt.show()

以下是输入图像,和它的彩色直方图。X轴显示了S的值(饱和度),Y轴显示了H的值(色调)。

在直方图里,你可以看到一些比较大的数值,在H = 100,S = 200附近。它属于天空的蓝色。相似的,在H = 25,S = 100附近也可以看到一个峰值。它属于宫殿的黄色。你可以使用任何图像编辑工具(如GIMP)验证它。

方法 - 3 : OpenCV 样本示例 !!

针对彩色直方图,这有个示例代码在 OpenCV-Python2 示例里(samples/python/color_histogram.py)。如果你运行这段代码,你可以看到直方图还显示出了对应的颜色,或者简单地说,它输出一个彩色编码的直方图。它的结果非常好(尽管您需要添加一些额外的行)。

在那段代码中,作者用HSV创建了一个颜色映射关系,然后将其转换为BGR。生成的直方图图像与此颜色映射相乘(译者注,矩阵乘法改变了颜色维度。)。他还使用一些预处理步骤来移除小的孤立像素,从而得到一个良好的直方图。

我把代码的运行、分析和破解留给读者。下面是那段代码针对上面同一张图像的输出结果:

你可以从直方图上清楚的看到代表什么颜色,蓝色、黄色。因为棋盘的存在还有些白色,很棒!!!

额外资源

练习

直方图 - 4 : 直方图反映射

目标

在这一章,我们会学到直方图反映射。

理论

它是由 Michael J. Swain, Dana H. Ballard 在它们的论文Indexing via color histograms(通过颜色直方图索引)中提出的。

简单来说,它到底是什么? 它用于图像分割或寻找图像中感兴趣的对象。简单的说,它创造了一个和我们输入图像相同大小(但只有一个单通道)的新图像,其中每一个像素点对应了该像素属于我们的(感兴趣的)对象的概率。更简单的说(译者注:In more simpler worlds是本段原话,目测worlds是错别字),输出图像将会让我们我们感兴趣的对象比其他部分更白。这就是一个直观的解释(我没办法更简化了)。直方图反映射常常与连续自适应均值漂移算法(译者注:CamShift算法的全称是"Continuously Adaptive Mean-SHIFT",附链接)等一起使用。

我们怎么做? 我们创建一个包含了我们感兴趣对象的图像的直方图(在我们接下来的示例中,感兴趣对象设为地面,不去管球员和其他东西)。感兴趣对象应该尽可能的填充这个图像,这样能得到更好的结果。并且推荐使用彩色直方图而不是灰度直方图,因为物体的颜色比起物体的灰度强度更好的定义了这个物体。然后我们在需要找出感兴趣对象的测试图像上开始“反映射”这个直方图,换句话说,我们计算每个像素点属于地面(我们感兴趣对象)的概率,并且显示这些像素点。在给定合理阈值的情况下,结果输出就会只给我们地面。

Numpy里的算法

  1. 首先,我们得计算需要找到的对象(地面)(设为“M”)和要搜索的图像(设为“I”)的彩色直方图。

    import numpy as np
    import cv2 as cvfrom matplotlib import pyplot as plt
    #roi is the object or region of object we need to find
    roi = cv.imread('rose_red.png')
    hsv = cv.cvtColor(roi,cv.COLOR_BGR2HSV)
    #target is the image we search in
    target = cv.imread('rose.png')
    hsvt = cv.cvtColor(target,cv.COLOR_BGR2HSV)
    # Find the histograms using calcHist. Can be done with np.histogram2d also
    M = cv.calcHist([hsv],[0, 1], None, [180, 256], [0, 180, 0, 256] )
    I = cv.calcHist([hsvt],[0, 1], None, [180, 256], [0, 180, 0, 256] )
  2. 算出比例 R = M / I。然后反映射R,就是说让把这个比值当做一个"调色板"来创造一个新图像,新图像中每个像素点的值都是它对应的属于我们感兴趣对象的概率。比如 B(x,y) = R[h(x,y),s(x,y)] h是(x,y)像素点的色调,s是(x,y)像素点的饱和度。在那之后再应用这个条件 B(x,y)=min[B(x,y),1](译者注:就是说如果上一步算出来某个点的值大于1,就统统设置为1。)。
    h,s,v = cv.split(hsvt)
    B = R[h.ravel(),s.ravel()]
    B = np.minimum(B,1)
    B = B.reshape(hsvt.shape[:2])
  3. 现在做一个圆盘卷积,B = D * B,其中D是圆盘内核。(译者注:圆盘卷积也叫循环卷积、圆周卷积。链接。)
    disc = cv.getStructuringElement(cv.MORPH_ELLIPSE,(5,5))
    cv.filter2D(B,-1,disc,B)
    B = np.uint8(B)
    cv.normalize(B,B,0,255,cv.NORM_MINMAX)
  4. 现在最大强度的位置就是了物体的位置。如果我们期望在图像中呈现一个区域,设置合适的阈值处理会得到一个很好的结果。
    ret,thresh = cv.threshold(B,50,255,0)

    搞定!!

OpenCV里的反映射

OpenCV 提供了一个内置函数 cv.calcBackProject()。它的参数几乎和 cv.calcHist() 函数一样。其中一个参数是直方图,也就是物体的直方图我们必须找到它。并且,这个物体的直方图参数应该在传入这个反映射函数之前被标准化。它返回的是(那张表示了每个像素点属于我们感兴趣物体的)概率的图像。然后我们用圆盘内核做卷积,应用阈值。以下是我的代码和运行结果:

import numpy as np
import cv2 as cv
roi = cv.imread('rose_red.png')
hsv = cv.cvtColor(roi,cv.COLOR_BGR2HSV)
target = cv.imread('rose.png')
hsvt = cv.cvtColor(target,cv.COLOR_BGR2HSV)
# calculating object histogram
roihist = cv.calcHist([hsv],[0, 1], None, [180, 256], [0, 180, 0, 256] )
# normalize histogram and apply backprojection
cv.normalize(roihist,roihist,0,255,cv.NORM_MINMAX)
dst = cv.calcBackProject([hsvt],[0,1],roihist,[0,180,0,256],1)
# Now convolute with circular disc
disc = cv.getStructuringElement(cv.MORPH_ELLIPSE,(5,5))
cv.filter2D(dst,-1,disc,dst)
# threshold and binary AND
ret,thresh = cv.threshold(dst,50,255,0)
thresh = cv.merge((thresh,thresh,thresh))
res = cv.bitwise_and(target,thresh)
res = np.vstack((target,thresh,res))
cv.imwrite('res.jpg',res)

下面是我操作过的一个例子。我使用蓝色矩形内的区域(一片草地)作为样本对象,而我想提取整个地面。

额外资源

  1. "Indexing via color histograms",Swain,Michael J,第三届计算机视觉国际会议,1990年。(就是本篇开头提到的论文)

练习


上篇:【翻译:OpenCV-Python教程】图像轮廓

下篇:【翻译:OpenCV-Python教程】傅里叶变换

【翻译:OpenCV-Python教程】OpenCV里的直方图相关推荐

  1. OpenCV Python教程(3)(4)(5): 直方图的计算与显示 形态学处理 初级滤波内

    OpenCV Python教程(3.直方图的计算与显示) 本篇文章介绍如何用OpenCV Python来计算直方图,并简略介绍用NumPy和Matplotlib计算和绘制直方图 直方图的背景知识.用途 ...

  2. OpenCV Python教程(2、图像元素的访问、通道分离与合并)

    OpenCV Python教程之图像元素的访问.通道分离与合并 转载请详细注明原作者及出处,谢谢! 访问像素 像素的访问和访问numpy中ndarray的方法完全一样,灰度图为: [python] v ...

  3. opencv python教程简书_OpenCV-Python系列二:常用的图像属性

    对于图像,我们经常需要知道关于图像的特殊属性,比如宽度,高度,面积,像素点数目等等,那么在opencv-python中,这些信息如何获取呢? 本文结构: 1.基本图像属性 2. 对于opencv中的特 ...

  4. opencv python教程-OpenCV4 Python 最新中文版官方教程来了(附下载)

    教程简介 OpenCV 是计算机视觉中经典的专用库,然而其中文版官方教程久久不来.近日,一款最新 OpenCV4.1 版本的完整中文版官方教程出炉,读者朋友可以更好的学习了解 OpenCV 相关细节. ...

  5. OpenCV Python教程(1、图像的载入、显示和保存)

    本文是OpenCV  2 Computer Vision Application Programming Cookbook读书笔记的第一篇.在笔记中将以Python语言改写每章的代码. PythonO ...

  6. opencv python教程简书_OpenCV-Python教程:27.图像转换

    理论 傅里叶变换用来分析多种过滤器的频率特征.对于图片,2D离散傅里叶变换(DFT)用来找频率范围.一个快速算法叫快速傅里叶变换(FFT)用来计算DFT. 对于正弦信号,x(t) = Asin(2πf ...

  7. opencv python教程简书_Python-OpenCV —— 基本操作一网打尽

    OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux.Windows.MacOS操作系统上.它轻量级而且高效--由一系列 C 函数和少量C++类构成,同时提供了Pyt ...

  8. opencv python 实现灰度图像和彩色图像直方图全局均衡化和自适应均衡化

    首先进行简单的灰度图像的全局均衡化和自适应均衡化 import cv2 as cv import numpy as npimg = cv.imread('cun.jpg',0)# 全局直方图均衡化 i ...

  9. opencv python教程简书_OpenCV-Python教程:28.模板匹配

    理论 模板匹配是在一个大图里搜索和找模板图像位置的方法.OpenCV有个函数cv2.matchTemplate()来做这个.它吧模板图像在输入图像上滑动,对比模板和在模板图像下的输入图像块.它返回了一 ...

  10. opencv python教程简书_OpenCV-Python教程:57.图像修复

    基础 你们可能家里都会有一些老照片已经有黑点啊,划痕啊等.你有想过修复它们么?我们不能简单的在绘图工具里把他们擦除了就完了.因为这样只是把黑色的东西变成白色的而已,实际上没用.在这种情况下,会用到一种 ...

最新文章

  1. 编程高手是如何练成的?
  2. 【Python刷题】_1
  3. EJS学习(一)之特性、安装、工作原理
  4. 20万人仍然每天活跃在“死”掉的ofo APP上:这已变成一个返利应用
  5. Shell脚本编程----变量的使用
  6. python在路径里添加变量_想学Python?那就先从头开始吧!
  7. Django创建图书管理项目(完整版
  8. 数据治理常见的误区有哪些
  9. 《Redis开发与运维》学习第八章
  10. 计算机网络-名词解释整理
  11. IOS移动应用跳转微信小程序
  12. python 面积计算器
  13. c语言对称矩形的判定,八年级数学下册 第19章 矩形、菱形与正方形 19.1.2 矩形的判定教案 (新版)华东师大版...
  14. Insert 语法全介绍
  15. 【C++ Primer】第十章 泛型算法 (练习)
  16. 谷歌插件.crx文件无法安装
  17. 云数据库RDS与自建数据库相比到底有什么优势?
  18. CISP含金量如何?
  19. 模拟重力场(多方向运动+碰撞检测+重力加速度+能量损失)
  20. Utorrent 设置

热门文章

  1. HTML heading
  2. 微信游戏,微信小说系统域名防封是如何做到的
  3. 激光中心线算法MATLAB仿真
  4. 领英常见问题,猎头如何导出Linkedin全球6亿人才资料
  5. KDL轨迹规划总结:(1)
  6. ps怎么撤销参考线_ps里怎么把参考线去掉
  7. thinkphp3.2.3 支付宝授权登录php
  8. android room 简书,android Room库使用问题
  9. 独家连载 | 深度学习“四大天王”,你知道几个?
  10. 关于这个开源项目 from VIP Lab