《OpenCV 轻松入门 面向Python》 学习笔记
Hu矩
Hu矩是归一化中心矩的线性组合,Hu矩再图像旋转,缩放,平移等操作后,仍能保持矩的不变性,经常使用 Hu 矩来识别图像的特征。在 OpenCV 中,使用函数 cv2.HuMoments()可以得到 Hu 距。该函数使用 cv2.moments()函数的返回值作为参数,返回 7 个 Hu 矩值。
矩函数 cv2.HuMoments()
函数原型:
hu = cv2.HuMoments( m )
- hu 表示返回的Hu 矩阵
- 参数m 是cv2.moments() 计算得到的矩特征值。
形状匹配 cv2.matchShapes()
我们可以通过Hu 矩来判断两个对象的一致性。为了更直观方便地比较Hu值,opencv 提供了函数 cv2.matchShapes() 对两个对象的Hu矩进行比较。
函数 cv2.matchShapes()允许我们提供两个对象,,这两个轮廓可以是轮廓, 也可以是灰度图。不管是什么,函数都会提前计算好对象的Hu矩。
函数原型:
retval = cv2.matchShapes( contour1, contour2, method, parameter )
参数:
- contour1: 第一个轮廓或者灰度图像
- contour2: 第二个灰度或轮廓图像
- method: 比较两个对象的Hu 矩的方法,ℎ𝑖𝐴和ℎ𝑖𝐵分别是对象 A 和对象 B 的 Hu 矩
- parameter 应用于mathod 的特定函数,暂不支持该参数,将该值设置为0即可。
举例:
import cv2
import numpy as np
# 读取图片
o1 = cv2.imread('18-1.jpg')
o2 = cv2.imread('18-2.jpg')
o3 = cv2.imread('12.jpg')
# 处理为单通道的灰度图
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)
# 查找轮廓
contours1, hierarchy = cv2.findContours(binary1, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
contours2, hierarchy = cv2.findContours(binary2, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
contours3, hierarchy = cv2.findContours(binary3, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
# 提取组织轮廓的点
cnt1 = contours1[0]
cnt2 = contours2[0]
cnt3 = contours3[0]
# 查看形状匹配
ret0 = cv2.matchShapes(cnt1,cnt1,1,0.0)
ret1 = cv2.matchShapes(cnt1,cnt2,1,0.0)
ret2 = cv2.matchShapes(cnt1,cnt3,1,0.0)
print("相同图像的 matchShape=",ret0)
print("相似图像的 matchShape=",ret1)
print("不相似图像的 matchShape=",ret2)
# 输出为:
# 相同图像的 matchShape= 0.0
# 相似图像的 matchShape= 0.12473414346068246
# 不相似图像的 matchShape= 1.7976931348623157e+308