代码语言:javascript复制
import cv2
o1=cv2.imread('C:/Users/xpp/Desktop/coins_1.png')#原始图像
o2=cv2.imread('C:/Users/xpp/Desktop/coins_2.png')#原始图像
o3=cv2.imread('C:/Users/xpp/Desktop/coins_3.png')#原始图像
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)
cv2.imshow("original1",o1)
cv2.imshow("original2",o2)
cv2.imshow("original3",o3)
cv2.waitKey()
cv2.destroyAllWindows()
相同图像的matchShape= 0.0 相似图像的matchShape= 0.19863853606386983 不相似图像的matchShape= 0.11567279132076783
算法:形状匹配是通过Hu矩来判断两张图像的一致性。同一幅图像的Hu矩相同,Hu矩差值为0。在图像旋转、缩放、平移等操作后,Hu矩差值不大。
对于图像A,图像B:
retval=cv2.matchShapes(contour1, contour2, method, parameter)
- contour1表示第1个轮廓或灰度图像
- contour2表示第2个轮廓或灰度图像
- method表示比较两个图像的Hu矩的方法
- parameter表示应用于method的特定参数