图像轮廓之形状匹配

《OpenCV轻松入门:面向Python》读书笔记
作者:李立宗
出版社:电子工业出版社
出版时间:2019-05

第12章 图像轮廓

12.3 Hu矩

  Hu矩是归一化中心矩的线性组合。Hu矩在图像旋转、缩放、平移等操作后,仍能保持矩的不变性,所以经常会使用Hu距来识别图像的特征。

  在OpenCV中,使用函数cv2.HuMoments()可以得到Hu距。该函数使用cv2.moments()函数的返回值作为参数,返回7个Hu矩值。

1) Hu矩函数

函数cv2.HuMoments()的语法格式为:

hu=cv2.HuMoments(m)

式中返回值hu,表示返回的Hu矩值;
参数m,是由函数cv2.moments()计算得到矩特征值。

2) 形状匹配

  我们可以通过Hu矩来判断两个对象的一致性。为了更直观方便地比较Hu矩值,OpenCV提供了函数cv2.matchShapes(),对两个对象的Hu矩进行比较。
  函数cv2.matchShapes()允许我们提供两个对象,对二者的Hu矩进行比较。这两个对象可以是轮廓,也可以是灰度图。不管是什么,cv2.matchShapes()都会提前计算好对象的Hu矩值。
函数cv2.matchShapes()的语法格式为:

retval=cv2.matchShapes(contour1,contour2,method,parameter)

式中retval是返回值。
该函数有如下4个参数:

  • contour1:第1个轮廓或者灰度图像。
  • contour2:第2个轮廓或者灰度图像。
  • method:比较两个对象的Hu矩的方法
  • parameter:应用于method的特定参数,该参数为扩展参数,目前(截至OpenCV 4.1.0版本)暂不支持该参数,因此将该值设置为0。

3) 示例

【例12.10】使用函数cv2.matchShapes()计算三幅不同图像的匹配度。

import cv2
#--------------读取3幅原始图像--------------------
o1 = cv2.imread('cs1.bmp')
o2 = cv2.imread('cs2.bmp')
o3 = cv2.imread('cc.bmp') 
#----------打印3幅原始图像的shape属性值-------------
print("o1.shape=",o1.shape)
print("o2.shape=",o2.shape)
print("o3.shape=",o3.shape)
#--------------色彩空间转换-------------------- 
gray1 = cv2.cvtColor(o1,cv2.COLOR_BGR2GRAY) 
gray2 = cv2.cvtColor(o2,cv2.COLOR_BGR2GRAY) 
gray3 = cv2.cvtColor(o3,cv2.COLOR_BGR2GRAY) 
#-------------进行Hu矩匹配--------------------
ret0 = cv2.matchShapes(gray1,gray1,1,0.0)
ret1 = cv2.matchShapes(gray1,gray2,1,0.0)
ret2 = cv2.matchShapes(gray1,gray3,1,0.0)
#--------------打印差值--------------------
print("相同图像的matchShape=",ret0)
print("相似图像的matchShape=",ret1)
print("不相似图像的matchShape=",ret2)
#--------------显示3幅原始图像--------------------
cv2.imshow("original1",o1)
cv2.imshow("original2",o2)
cv2.imshow("original3",o3)
cv2.waitKey()
cv2.destroyAllWindows()

输出结果

o1.shape= (425, 514, 3)
o2.shape= (42, 51, 3)
o3.shape= (425, 514, 3)
相同图像的matchShape= 0.0
相似图像的matchShape= 0.0001154058519395873

不相似图像的matchShape= 0.012935752303635195

从以上结果可以看出:

  • 同一幅图像的Hu矩是不变的,二者差值为0。
  • 相似的图像即使发生了平移、旋转和缩放后,函数cv2.matchShapes()的返回值仍然比较接近。例如,图像o1和图像o2, o2是对o1经过缩放、旋转和平移后得到的,但是对二者应用cv2.matchShapes()函数后,返回值的差较小。
  • 不相似图像cv2.matchShapes()函数返回值的差较大。例如,图像o1和图像o3的差别较大,因此对二者应用cv2.matchShapes()函数后,返回值的差也较大。

你可能感兴趣的:(图像轮廓之形状匹配)