击不击中变换
算法步骤:
- 开三个内存缓冲区,用来保存原图像数据,结构元素H对原图像的腐蚀结果,结构元素M对原图像补集的腐蚀结果
- 保存原图像数据,用结构元素H对原图像腐蚀,并保存腐蚀后的结果
- 恢复原图像,并对其求补
- 用结构元素M对原图像的补进行腐蚀操作,并保存腐蚀后的结果
- 求两个腐蚀结果的交集,即击中与击不中的结果
骨架提取
算法步骤:
- 获得原图像的首地址及图像的宽和高,并设置循环标志1
- 用结构元素腐蚀原图像,并保存腐蚀结果
- 设置循环标志为0,如果腐蚀结果中有一个点为255,即原图像尚未被完全腐蚀成空集,则将循环标志设为1.
- 用结构元素对腐蚀后的图像进行开运算(消除小的白色区域),并求取腐蚀运算与开运算的差(得到消除的白色区域)
- 用[4]中求得的结果与之前求得的骨架进行并集运算,以获得本次循环求得的骨架
- 把本次循环中保存的腐蚀结果赋值给原图像
- 重复步骤[2]-[6],直到将原图像腐蚀成空集为止。
最终求得的骨架就是结果。
代码
def skeleton(im):
"""
骨架提取
:param im:
:return:
"""
thresh, im = cv.threshold(im, 0, 255, cv.THRESH_BINARY + cv.THRESH_OTSU)
# cv.imshow('binary.png', im) # 控制背景为黑色
dst = im.copy()
num_erode = 0
while True:
if np.sum(dst) == 0:
break
kernel = cv.getStructuringElement(cv.MORPH_CROSS, (4, 4))
dst = cv.erode(dst, kernel)
num_erode = num_erode + 1
skeleton = np.zeros(dst.shape, np.uint8)
for x in range(num_erode):
kernel = cv.getStructuringElement(cv.MORPH_CROSS, (3, 3))
dst = cv.erode(im, kernel, None, None, x)
open_dst = cv.morphologyEx(dst, cv.MORPH_OPEN, kernel)
result = dst - open_dst
skeleton = skeleton + result
# cv2.waitKey(1000)
# cv.imshow("skeleton", skeleton)
return skeleton