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

《轻松入门:面向》学习笔记(九)7. 轮廓的特征值
1-3 查找并绘制轮廓、矩特性及Hu矩
学习笔记(九)——图像轮廓(上)
4-5 轮廓拟合及凸包
学习笔记(九)——图像轮廓(中)
6. 利用形状场景算法比较轮廓
用矩比较形状是一种非常有效的方法,不过现在有了更有效的方法 。从 3开始,有了专有模块shape,该模块中的形状场景算法能够更高效地比较形状 。
6.1 计算形状场景距离
提供了使用“距离”作为形状比较的度量标准 。这是因为形状之间的差异值和距离有相似之处,比如二者都只能是零或者正数,又比如当两个形状一模一样时距离值和差值都等于零 。
= cv2.( [, [, [, [, [, [, [, ]]]]]]] )
式中的返回值为,返回结果 。
该结果可以通过函数()计算两个不同形状之间的距离 。此函数的语法格式为:
=(, )
式中,和 是不同的轮廓 。
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 计算距离
距离的计算方法是:
(1)针对图像A 内的每一个点,寻找其距离图像B 的最短距离,将这个最短距离作为
直接距离D1 。
(2)针对图像B 内的每一个点,寻找其距离图像A 的最短距离,将这个最短距离作为
直接距离D2 。
(3)将上述D1、D2 中的较大者作为 距离 。
= cv2.( [,[, ]])
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