【youcans 的 OpenCV 例程 200 篇】121. 击中-击不中用于特征识别
击中-击不中是形态检测的基本工具,可以实现对象的细化和剪枝操作,常用于物体识别、图像细化。
击中-击不中变换变换定义为两个结构元 B1、B2 对对集合 A 的运算:
I
⊛
B
1
,
2
=
(
A
⊖
B
1
)
∩
(
A
c
⊖
B
2
)
I \circledast B_{1,2} = (A \ominus B_1) \cap (A^c \ominus B_2)
I⊛B1,2=(A⊖B1)∩(Ac⊖B2)
结构元 B1 对图像上进行腐蚀、结构元 B2 对图像的补集进行腐蚀,二者的结果相减得到击中-击不中变换。
击中击不中变换有两个结构元,B1 是当前位置可以有的形状,B2是当前位置不可以有的形状,虽然总体而言这两个结构元应该被视为一体,但在实际运算中是先后进行两次腐蚀运算,然后取交集。
严格来说,击中击不中并非相当于腐蚀操作,而是类似于严格的模板匹配。只有符合要求的形状,才会在最终结果中显示出来。
OpenCV 中的函数 cv.morphologyEx 可以实现击中-击不中变换,但要将参数 op 设为 cv.MORPH_HITMISS,并使用 CV_32SC 数据类型。
例程 10.9:击中-击不中变换进行特征识别
本例使用击中-击不中变换进行特征识别,提取绳结特征。
# 10.9 击中-击不中变换进行特征识别
# 读取原始图像
imgGray = cv2.imread("../images/imgNetrope.png", flags=0) # flags=0 读取为灰度图像
ret, imgBin = cv2.threshold(imgGray, 25, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU) # 二值化处理
# 击中击不中变换
kernal1 = cv2.getStructuringElement(cv2.MORPH_CROSS, (5, 5), (-1, -1))
kernal2 = cv2.getStructuringElement(cv2.MORPH_CROSS, (9,9), (-1, -1))
imgHMT1 = cv2.morphologyEx(imgBin, cv2.MORPH_HITMISS, kernal1)
imgHMT2 = cv2.morphologyEx(imgBin, cv2.MORPH_HITMISS, kernal2)
plt.figure(figsize=(9, 5))
plt.subplot(131), plt.axis('off'), plt.title("Origin")
plt.imshow(imgBin, cmap='gray', vmin=0, vmax=255)
plt.subplot(132), plt.title("HMT (5,5)"), plt.axis('off')
plt.imshow(imgHMT1, cmap='gray', vmin=0, vmax=255)
plt.subplot(133), plt.title("HMT (9,9)"), plt.axis('off')
plt.imshow(imgHMT2, cmap='gray', vmin=0, vmax=255)
plt.tight_layout()
plt.show()
(本节完)
版权声明:
youcans@xupt 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/123344496)
Copyright 2022 youcans, XUPT
Crated:2022-3-6