《OpenCV轻松入门:面向Python》学习笔记(九)

  • 1-3 查找并绘制轮廓、矩特性及Hu矩
  • 4-5 轮廓拟合及凸包
  • 6. 利用形状场景算法比较轮廓
    • 6.1 计算形状场景距离
    • 6.2 计算Hausdorff距离
  • 7. 轮廓的特征值
    • 7.1 宽高比
    • 7.2 Extend
    • 7.3 Solidity
    • 7.4 等效直径(Equivalent Diameter)
    • 7.5 方向
    • 7.6 掩模和像素点
    • 7.7 最大值和最小值及它们的位置
    • 7.8 平均颜色及平均灰度
    • 7.9 极点

1-3 查找并绘制轮廓、矩特性及Hu矩

OpenCV学习笔记(九)——图像轮廓(上)

4-5 轮廓拟合及凸包

OpenCV学习笔记(九)——图像轮廓(中)

6. 利用形状场景算法比较轮廓

用矩比较形状是一种非常有效的方法,不过现在有了更有效的方法。从OpenCV 3开始,有了专有模块shape,该模块中的形状场景算法能够更高效地比较形状。

6.1 计算形状场景距离

OpenCV 提供了使用“距离”作为形状比较的度量标准。这是因为形状之间的差异值和距离有相似之处,比如二者都只能是零或者正数,又比如当两个形状一模一样时距离值和差值都等于零。

retval = cv2.createShapeContextDistanceExtractor( [, nAngularBins[, nRadialBins[, innerRadius[, outerRadius[, iterations[, comparer[, transformer]]]]]]] )

  • nAngularBins:为形状匹配中使用的形状上下文描述符建立的角容器的数量。
  • nRadialBins:为形状匹配中使用的形状上下文描述符建立的径向容器的数量。
  • innerRadius:形状上下文描述符的内半径。
  • outerRadius:形状上下文描述符的外半径。
  • iterations:迭代次数。
  • comparer:直方图代价提取算子。该函数使用了直方图代价提取仿函数,可以直接采用直方图代价提取仿函数的算子作为参数。
  • transformer:形状变换参数。

式中的返回值为retval,返回结果。

该结果可以通过函数cv2.ShapeDistanceExtractor.computeDistance()计算两个不同形状之间的距离。此函数的语法格式为:

retval=cv2.ShapeDistanceExtractor.computeDistance(contour1, contour2)

式中,coutour1 和coutour2 是不同的轮廓。

import cv2
#-----------原始图像o1 的边缘--------------------
o1 = cv2.imread('cs.bmp')
cv2.imshow("original1",o1)
gray1 = cv2.cvtColor(o1,cv2.COLOR_BGR2GRAY)
ret, binary1 = cv2.threshold(gray1,127,255,cv2.THRESH_BINARY)
image,contours1, hierarchy = cv2.findContours(binary1,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
cnt1 = contours1[0]
#-----------原始图像o2 的边缘--------------------
o2 = cv2.imread('cs3.bmp')
cv2.imshow("original2",o2)
gray2 = cv2.cvtColor(o2,cv2.COLOR_BGR2GRAY)
ret, binary2 = cv2.threshold(gray2,127,255,cv2.THRESH_BINARY)
image,contours2, hierarchy = cv2.findContours(binary2,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
cnt2 = contours2[0]
#-----------原始图像o3 的边缘--------------------
o3 = cv2.imread('hand.bmp')
cv2.imshow("original3",o3)
gray3 = cv2.cvtColor(o3,cv2.COLOR_BGR2GRAY)
ret, binary3 = cv2.threshold(gray3,127,255,cv2.THRESH_BINARY)
image,contours3, hierarchy = cv2.findContours(binary3,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
cnt3 = contours3[0]
#-----------构造距离提取算子--------------------
sd = cv2.createShapeContextDistanceExtractor()
#-----------计算距离--------------------
d1 = sd.computeDistance(cnt1,cnt1)
print("与自身的距离d1=", d1)
d2 = sd.computeDistance(cnt1,cnt2)
print("与旋转缩放后的自身图像的距离d2=", d2)
d3 = sd.computeDistance(cnt1,cnt3)
print("与不相似对象的距离d3=", d3)
#-----------显示距离--------------------
cv2.waitKey()
cv2.destroyAllWindows()运行后程序会显示如下的运行结果:
与自身的距离d1= 0.0
与旋转缩放后的自身图像的距离d2= 0.7913379669189453
与不相似对象的距离d3= 2.75199031829834


从上述运行结果可以看出;

  • 相同图像之间的形状场景距离为零。
  • 相似图像之间的形状场景距离较小。
  • 不同图像之间的形状场景距离较大。

6.2 计算Hausdorff距离

Hausdorff 距离的计算方法是:
(1)针对图像A 内的每一个点,寻找其距离图像B 的最短距离,将这个最短距离作为
Hausdorff 直接距离D1。
(2)针对图像B 内的每一个点,寻找其距离图像A 的最短距离,将这个最短距离作为
Hausdorff 直接距离D2。
(3)将上述D1、D2 中的较大者作为Hausdorff 距离。

retval = cv2.createHausdorffDistanceExtractor( [, distanceFlag [, rankProp]])

  • distanceFlag 为距离标记,是可选参数。
  • rankProp 为一个比例值,范围在0 到1 之间,也是可选参数。
import cv2
#-----------读取原始图像--------------------
o1 = cv2.imread('cs.bmp')
o2 = cv2.imread('cs3.bmp')
o3 = cv2.imread('hand.bmp')
cv2.imshow("original1",o1)
cv2.imshow("original2",o2)
cv2.imshow("original3",o3)
#-----------色彩转换--------------------
gray1 = cv2.cvtColor(o1,cv2.COLOR_BGR2GRAY)
gray2 = cv2.cvtColor(o2,cv2.COLOR_BGR2GRAY)
gray3 = cv2.cvtColor(o3,cv2.COLOR_BGR2GRAY)
#-----------阈值处理--------------------
ret, binary1 = cv2.threshold(gray1,127,255,cv2.THRESH_BINARY)
ret, binary2 = cv2.threshold(gray2,127,255,cv2.THRESH_BINARY)
ret, binary3 = cv2.threshold(gray3,127,255,cv2.THRESH_BINARY)
#-----------提取轮廓--------------------
image,contours1, hierarchy = cv2.findContours(binary1,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
image,contours2, hierarchy = cv2.findContours(binary2,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
image,contours3, hierarchy = cv2.findContours(binary3,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
cnt1 = contours1[0]
cnt2 = contours2[0]
cnt3 = contours3[0]
#-----------构造距离提取算子--------------------
hd = cv2.createHausdorffDistanceExtractor()
#-----------计算距离--------------------
d1 = hd.computeDistance(cnt1,cnt1)
print("与自身图像的Hausdorff 距离d1=", d1)
d2 = hd.computeDistance(cnt1,cnt2)
print("与旋转缩放后的自身图像的Hausdorff 距离d2=", d2)
d3 = hd.computeDistance(cnt1,cnt3)
print("与不相似对象的Hausdorff 距离d3=", d3)
#-----------显示距离--------------------
cv2.waitKey()
cv2.destroyAllWindows()运行后程序会显示如下的运行结果:
与自身图像的Hausdorff 距离d1= 0.0
与旋转缩放后的自身图像的Hausdorff 距离d2= 18.357559204101562
与不相似对象的Hausdorff 距离d3= 57.27128601074219


从上述运行结果可以看出:

  • 相同图像之间的Hausdorff 距离为零。
  • 相似图像之间的Hausdorff 距离较小。
  • 不同图像之间的Hausdorff 距离较大。

7. 轮廓的特征值

轮廓自身的一些属性特征及轮廓所包围对象的特征对于描述图像具有重要意义。本节介绍几个轮廓自身的属性特征及轮廓所包围对象的特征。

7.1 宽高比

可以使用宽高比(AspectRation)来描述轮廓,例如矩形轮廓的宽高比为:宽高比 = 宽度(Width) / 高度(Height)

import cv2
o = cv2.imread('cc.bmp')
cv2.imshow("original",o)
gray = cv2.cvtColor(o,cv2.COLOR_BGR2GRAY)
ret, binary = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
image,contours, hierarchy = cv2.findContours(binary,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
x,y,w,h = cv2.boundingRect(contours[0])
cv2.rectangle(o,(x,y),(x+w,y+h),(255,255,255),3)
aspectRatio = float(w)/h
print(aspectRatio)
cv2.imshow("result",o)
cv2.waitKey()
cv2.destroyAllWindows()运行后程序显示如下的运行结果:
2.1506849315068495

7.2 Extend

可以使用轮廓面积与矩形边界(矩形包围框、矩形轮廓)面积之比Extend来描述图像及其轮廓特征。计算方法为:Extend = 轮廓面积(对象面积) / 矩形边界面积

import cv2
o = cv2.imread('cc.bmp')
cv2.imshow("original",o)
gray = cv2.cvtColor(o,cv2.COLOR_BGR2GRAY)
ret, binary = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
image,contours, hierarchy = cv2.findContours(binary,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
x,y,w,h = cv2.boundingRect(contours[0])
cv2.drawContours(o,contours[0],-1,(0,0,255),3)
cv2.rectangle(o,(x,y),(x+w,y+h),(255,0,0),3)
rectArea=w*h
cntArea=cv2.contourArea(contours[0])
extend=float(cntArea)/rectArea
print(extend)
cv2.imshow("result",o)
cv2.waitKey()
cv2.destroyAllWindows()运行后程序显示如下的运行结果:
0.6717127650292296

7.3 Solidity

可以使用轮廓面积与凸包面积之比Solidity 来衡量图像、轮廓及凸包的特征。其计算方法为:Solidity = 轮廓面积(对象面积) / 凸包面积

import cv2
o = cv2.imread('hand.bmp')
cv2.imshow("original",o)
gray = cv2.cvtColor(o,cv2.COLOR_BGR2GRAY)
ret, binary = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
image,contours, hierarchy =
cv2.findContours(binary,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(o,contours[0],-1,(0,0,255),3)
cntArea=cv2.contourArea(contours[0])
hull = cv2.convexHull(contours[0])
hullArea = cv2.contourArea(hull)
cv2.polylines(o, [hull], True, (0, 255, 0), 2)
solidity=float(cntArea)/hullArea
print(solidity)
cv2.imshow("result",o)
cv2.waitKey()
cv2.destroyAllWindows()运行后程序显示如下的运行结果:
0.6752344564084751

7.4 等效直径(Equivalent Diameter)

可以用等效直径来衡量轮廓的特征值,该值是与轮廓面积相等的圆形的直径。其计算公式
为:等效直径 = 根号(4*轮廓面积/Π)

import cv2
import numpy as np
o = cv2.imread('cc.bmp')
cv2.imshow("original",o)
gray = cv2.cvtColor(o,cv2.COLOR_BGR2GRAY)
ret, binary = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
image,contours, hierarchy = cv2.findContours(binary,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(o,contours[0],-1,(0,0,255),3)
cntArea=cv2.contourArea(contours[0])
equiDiameter = np.sqrt(4*cntArea/np.pi)
print(equiDiameter)
cv2.circle(o,(100,100),int(equiDiameter/2),(0,0,255),3) #展示等直径大小的圆
cv2.imshow("result",o)
cv2.waitKey()
cv2.destroyAllWindows()运行后程序显示如下的运行结果:
99.00522529212108

7.5 方向

在 OpenCV 中,函数cv2.fitEllipse()可以用来构造最优拟合椭圆,还可以在返回值内分别返回椭圆的中心点、轴长、旋转角度等信息。使用这种形式,能够更直观地获取椭圆的方向等信息。

(x,y),(MA,ma),angle = cv2.fitEllipse(cnt)

  • (x,y):椭圆的中心点。
  • (MA,ma):椭圆水平方向轴和垂直方向轴的长度。
  • angle:椭圆的旋转角度。
import cv2
o = cv2.imread('cc.bmp')
cv2.imshow("original",o)
gray = cv2.cvtColor(o,cv2.COLOR_BGR2GRAY)
ret, binary = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
image,contours, hierarchy = cv2.findContours(binary,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
ellipse = cv2.fitEllipse(contours[0])
retval=cv2.fitEllipse(contours[0])
print("单个返回值形式:")
print("retval=\n",retval)
(x,y),(MA,ma),angle = cv2.fitEllipse(contours[0])
print("三个返回值形式:")
print("(x,y)=(",x,y,")")
print("(MA,ma)=(",MA,ma,")")
print("angle=",angle)
cv2.ellipse(o,ellipse,(0,0,255),2)
cv2.imshow("result",o)
cv2.waitKey()
cv2.destroyAllWindows()运行后程序显示如下的运行结果:
单个返回值形式:
retval=
((276.2112731933594, 139.6067352294922), (63.01350021362305,
166.72308349609375), 82.60102844238281)
三个返回值形式:
(x,y)=( 276.2112731933594 139.6067352294922 )
(MA,ma)=( 63.01350021362305 166.72308349609375 )
angle= 82.60102844238281


从以上运行结果可以看出,函数cv2.fitEllipse()以不同形式返回的值是相同的。

7.6 掩模和像素点

有时,我们希望获取某对象的掩模图像及其对应的点。1.3 节介绍了将函数cv2.drawContours()的轮廓宽度参数thickness设置为“-1”,即可获取特定对象的实心轮廓,即特定对象的掩模。另外,我们可能还希望获取轮廓像素点的具体位置信息。本节介绍如何获取轮廓(实心、空心)的像素点位置信息。

OpenCV 提供了函数cv2.findNonZero()用于查找非零元素的索引。该函数的语法格式为:

idx = cv2.findNonZero( src )

  • idx 为返回值,表示非零元素的索引位置。需要注意的是,在返回的索引中,每个元素对应的是(列号,行号)的格式。
  • src 为参数,表示要查找非零元素的图像。
#使用OpenCV 函数cv2.findNonZero()获取一个数组内的非零值。
import cv2
import numpy as np
#------------生成一个元素都是零值的数组a-------------------
a=np.zeros((5,5),dtype=np.uint8)
#-------随机将其中10 个位置上的值设置为1------------
#---times 控制次数
#---i,j 是随机生成的行、列位置
#---a[i,j]=1,将随机挑选出来的位置上的值设置为1
for times in range(10):
i=np.random.randint(0,5)
j=np.random.randint(0,5)
a[i,j]=1
#-------打印数组a,观察数组a 内值的情况-----------
print("a=\n",a)
#------查找数组a 内非零值的位置信息------------
loc = cv2.findNonZero(a)
#-----输出数组a 内非零值的位置信息------------
print("a 内非零值的位置:\n",loc)运行上述程序,会显示如下的运行结果:
a=
[[0 0 0 0 0]
[0 0 0 0 1]
[0 0 1 1 1]
[1 1 0 0 1]
[1 1 0 0 0]]
a 内非零值的位置:
[[[4 1]]
[[2 2]]
[[3 2]]
[[4 2]]
[[0 3]]
[[1 3]]
[[4 3]]
[[0 4]]
[[1 4]]]
#使用OpenCV 函数cv2.findNonZero()获取一个图像内的轮廓点的位置。
import cv2
import numpy as np
#-----------------读取原始图像----------------------
o = cv2.imread('cc.bmp')
cv2.imshow("original",o)
#-----------------获取轮廓------------------------
gray = cv2.cvtColor(o,cv2.COLOR_BGR2GRAY)
ret, binary = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
image,contours, hierarchy = cv2.findContours(binary,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
cnt=contours[0]
#-----------------绘制空心轮廓------------------------
mask1 = np.zeros(gray.shape,np.uint8)
cv2.drawContours(mask1,[cnt],0,255,2)
pixelpoints1 = cv2.findNonZero(mask1)
print("pixelpoints1.shape=",pixelpoints1.shape)
print("pixelpoints1=\n",pixelpoints1)
cv2.imshow("mask1",mask1)
#-----------------绘制实心轮廓---------------------
mask2 = np.zeros(gray.shape,np.uint8)
cv2.drawContours(mask2,[cnt],0,255,-1)
pixelpoints2 = cv2.findNonZero(mask2)
print("pixelpoints2.shape=",pixelpoints2.shape)
print("pixelpoints2=\n",pixelpoints2)
cv2.imshow("mask2",mask2)
#-----------------释放窗口------------------------
cv2.waitKey()
cv2.destroyAllWindows()#运行后程序显示如下的运行结果:
pixelpoints1.shape= (1400, 1, 2)
pixelpoints1=
[[[292 106]]
[[293 106]]
[[294 106]]
...
[[222 180]]
[[223 180]]
[[224 180]]]
pixelpoints2.shape= (7892, 1, 2)
pixelpoints2=
[[[293 107]]
[[294 107]]
[[295 107]]
...
[[221 179]]
[[222 179]]
[[223 179]]]

7.7 最大值和最小值及它们的位置

min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(imgray,mask = mask)

  • min_val:最小值。
  • max_val:最大值。
  • min_loc:最小值的位置。
  • max_loc:最大值的位置。
  • imgray:单通道图像。
  • mask:掩模。通过使用掩模图像,可以得到掩模指定区域内的最值信息。
import cv2
import numpy as np
o = cv2.imread('ct.png')
cv2.imshow("original",o)
gray = cv2.cvtColor(o,cv2.COLOR_BGR2GRAY)
ret, binary = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
image,contours, hierarchy = cv2.findContours(binary,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
cnt=contours[2] #coutours[0]、coutours[1]是左侧字母R
#--------使用掩模获取感兴趣区域的最值-----------------
#需要注意函数minMaxLoc 处理的对象为灰度图像,本例中处理的对象为灰度图像gray
#如果希望获取彩色图像的最值,需要提取各个通道图像,为每个通道独立计算最值
mask = np.zeros(gray.shape,np.uint8)
mask=cv2.drawContours(mask,[cnt],-1,255,-1)
minVal, maxVal, minLoc, maxLoc = cv2.minMaxLoc(gray,mask = mask)
print("minVal=",minVal)
print("maxVal=",maxVal)
print("minLoc=",minLoc)
print("maxLoc=",maxLoc)
#--------使用掩模获取感兴趣区域并显示-----------------
masko = np.zeros(o.shape,np.uint8)
masko=cv2.drawContours(masko,[cnt],-1,(255,255,255),-1)
loc=cv2.bitwise_and(o,masko)
cv2.imshow("mask",loc)
#显示灰度结果
#loc=cv2.bitwise_and(gray,mask)
#cv2.imshow("mask",loc)
#--------释放窗口-----------------
cv2.waitKey()
cv2.destroyAllWindows()程序显示如下的运行结果:
minVal= 42.0
maxVal= 200.0
minLoc= (87, 90)
maxLoc= (90, 110)

7.8 平均颜色及平均灰度

mean_val = cv2.mean(im,mask = mask)

  • im:原图像。
  • mask:掩模。
import cv2
import numpy as np
#--------读取并显示原始图像-----------------
o = cv2.imread('ct.png')
cv2.imshow("original",o)
#--------获取轮廓-----------------
gray = cv2.cvtColor(o,cv2.COLOR_BGR2GRAY)
ret, binary = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
image,contours, hierarchy = cv2.findContours(binary,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
cnt=contours[2] #coutours[0]、coutours[1]是左侧字母R
#--------使用掩模获取感兴趣区域的均值-----------------
mask = np.zeros(gray.shape,np.uint8) #构造mean 所使用的掩模(必须是单通道的)
cv2.drawContours(mask,[cnt],0,(255,255,255),-1)
meanVal = cv2.mean(o,mask = mask) # mask 是一个区域,所以必须是单通道的
print("meanVal=\n",meanVal)
#--------使用掩模获取感兴趣区域并显示-----------------
masko = np.zeros(o.shape,np.uint8)
cv2.drawContours(masko,[cnt],-1,(255,255,255),-1)
loc=cv2.bitwise_and(o,masko)
cv2.imshow("mask",loc)
#--------释放窗口-----------------
cv2.waitKey()
cv2.destroyAllWindows()运行后程序显示如下的运行结果:
meanVal= (85.45594913714805, 85.45594913714805, 85.45594913714805, 0.0)

从上述结果可以看出,函数cv2.mean()能够计算各个通道的均值。上述4个值分别是RGB和A通道(alpha通道)的均值。本例中,RGB三个通道的值相同,所以计算出的均值也是一样的。

7.9 极点

有时,我们希望获取某个对象内的极值点,例如最左端、最右端、最上端、最下端的四个点。OpenCV提供了相应的函数来找出这些点,通常的语法格式是:
leftmost = tuple(cnt[cnt[:,:,0].argmin()][0]) rightmost = tuple(cnt[cnt[:,:,0].argmax()][0]) topmost = tuple(cnt[cnt[:,:,1].argmin()][0]) bottommost = tuple(cnt[cnt[:,:,1].argmax()][0])

import cv2
import numpy as np
o = cv2.imread('cs.bmp')
#--------获取并绘制轮廓-----------------
gray = cv2.cvtColor(o,cv2.COLOR_BGR2GRAY)
ret, binary = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
image,contours, hierarchy = cv2.findContours(binary,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
mask = np.zeros(gray.shape,np.uint8)
cnt=contours[0]
cv2.drawContours(mask,[cnt],0,255,-1)
#--------计算极值-----------------
leftmost = tuple(cnt[cnt[:,:,0].argmin()][0])
rightmost = tuple(cnt[cnt[:,:,0].argmax()][0])
topmost = tuple(cnt[cnt[:,:,1].argmin()][0])
bottommost = tuple(cnt[cnt[:,:,1].argmax()][0])
#--------打印极值-----------------
print("leftmost=",leftmost)
print("rightmost=",rightmost)
print("topmost=",topmost)
print("bottommost=",bottommost)
#--------绘制说明文字-----------------
font=cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(o,'A',leftmost, font, 1,(0,0,255),2)
cv2.putText(o,'B',rightmost, font, 1,(0,0,255),2)
cv2.putText(o,'C',topmost, font, 1,(0,0,255),2)
cv2.putText(o,'D',bottommost, font, 1,(0,0,255),2)
#--------绘制图像-----------------
cv2.imshow("result",o)
#--------释放窗口-----------------
cv2.waitKey()
cv2.destroyAllWindows()运行后程序显示如下的运行结果:
leftmost= (202, 135)
rightmost= (423, 120)
topmost= (369, 69)
bottommost= (216, 179)

OpenCV学习笔记(九)——图像轮廓(下)相关推荐

  1. C++下opencv学习笔记(一)(图像的简单读取丶显示与存储)

    C++下opencv学习笔记(一)(图像的简单读取丶显示与存储) 前言 学习C++ OpenCV,第一需要具备面向对象语言的基础,第二要对图像处理机器学习有基础了解,容易入门.觉得自己基础已经有了可以 ...

  2. Opencv学习笔记(八) -- 图像色彩空间转换

    1.常见图像色彩空间 RGB RGB色彩模式是工业界的一种颜色标准,是通过对红(R).绿(G).蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红.绿.蓝三个通道 ...

  3. OpenCV学习笔记(七)——图像梯度及边缘检测

    图像梯度计算的是图像变化的速度.对于图像的边缘部分,其灰度值变化较大,梯度值也较大:相反,对于图像中比较平滑的部分,其灰度值变化较小,相应的梯度值也较小.一般情况下,图像梯度计算的是图像的边缘信息. ...

  4. 《OpenCV3编程入门》学习笔记8 图像轮廓与图像分割修复(一)查找并绘制轮廓

    第8章 图像轮廓与图像分割修复 8.1 查找并绘制轮廓 8.1.1 寻找轮廓:findContours()函数 1.作用:在二值图像中寻找轮廓 2.函数原型: void findcontours(In ...

  5. [OpenCV学习笔记3][图像的加载+修改+显示+保存]

    正式进入OpenCV学习了,前面开始的都是一些环境搭建和准备工作,对一些数据结构的认识主要是Mat类的认识: [1.学习目标] 图像的加载:imread() 图像的修改:cvtColor() 图像的显 ...

  6. 《OpenCV3编程入门》学习笔记8 图像轮廓与图像分割修复(四)图像的矩

    8.4 图像的矩 从一幅数字图形中计算出来的矩集,通常描述了该图像形状的全局特征,并提供了大量关于该图像不同类型的几何特性信息,如大小.位置.方向.形状等 (1)一阶矩与形状有关 (2)二阶矩显示曲线 ...

  7. OpenCV学习笔记之图像融合

    一.线性融合操作 线性混合操作 也是一种典型的二元(两个输入)的 像素操作 : 通过在范围  内改变  ,这个操可以用来对两幅图像或两段视频产生时间上的 画面叠化 (cross-dissolve)效果 ...

  8. 《OpenCV3编程入门》学习笔记8 图像轮廓与图像分割修复(五)分水岭算法(watershed algorithm)

    8.5 分水岭算法(watershed algorithm) 1.基于拓扑理论的数学形态学的分割方法. 2.基本思想:把图像看作测地学上的拓扑地貌,图像中每一点像素的灰度值表示该点的海拔高度,每一个局 ...

  9. 《OpenCV3编程入门》学习笔记8 图像轮廓与图像分割修复(三)使用多边形将轮廓包围

    8.3 使用多边形将轮廓包围 8.3.1 将轮廓包围的多边形函数 1.返回外部边界:boundingRect()函数 (1)作用:返回指定点集最外面的边界矩形(四个顶点) (2)函数原型:Rect b ...

最新文章

  1. webstorm2018修改运行web page端口号,并且让web在本地局域网内用IP访问
  2. JS输入框统计文字数量
  3. JS笔记(20): JS中的同步编程和异步编程
  4. left join 、right join 、inner join和 full join的区别
  5. 深入学习SAP UI5框架代码系列之三:HTML原生事件 VS UI5 Semantic事件
  6. 权威解读 | 人类社会正进入DT时代 如何激活生产力?
  7. wshttpbinding java_WCF自定义用户账号密码之WCF系结模式wsHttpBinding的Java调用
  8. 通过MVC模式将Web视图和逻辑代码分离
  9. 配置WIN2003远程桌面的客户端连接数
  10. ArcScan矢量化
  11. Java实现简单的银行卡
  12. 使用阿里云PCDN降低内容分发成本
  13. mysql语句格式化日期时间成特定格式
  14. 电工学复习【2】-- 电路的分析方法
  15. lammps案例分析(2):石墨烯单轴拉伸之deform方式
  16. RabbitMQ入门笔记
  17. Android之自定义Dialog(Layout引入布局)
  18. 二、Servlet生命周期
  19. Linus 命名 [冰封荒原] 版 Linux 内核的思考
  20. JavaScript基础DOM操作--在线英文发音

热门文章

  1. java集合转字符串_关于集合和字符串的互转实现方法
  2. 如何爬取看雪学院的课程
  3. hive 计算两个经纬度之间的距离
  4. CAD软件入门教程,分享给零基础的人
  5. 上海交大计算机科学技术导师介绍,上海交通大学
  6. linux 挂载 nfs 权限,救急:nfs挂载问题
  7. 手机上怎么将DWG转PDF?这个方法轻松解决
  8. 14个提高代码质量的好问题
  9. 1905协议详解(三)基于IEEE Std1905.1的IEEE802.1 access point autoconfiguration 协议和Link metrics
  10. 电脑上永久删除的文件怎么恢复?其实很简单