【发布时间】:2019-11-16 06:35:45
【问题描述】:
我正在尝试使用https://homepages.inf.ed.ac.uk/rbf/HIPR2/thin.htm 中所述的细化/命中或未命中方法来实现骨架化算法。
我想提取以下图像的骨架,我认为这是一个很好的测试图像:
https://github.com/TiagoB936/Image-Processing-and-Computer-Vision/blob/master/Skeletonization/x.png
问题是我的代码无法停止运行,我没有发现问题。
我的代码执行以下步骤:
- 读取图像并将其二值化
-
创建 2 个主内核:
[[0,0,0]
[-1,1,-1]
[1,1,1]]
和
[[-1,0,0]
[1,1,0]
[-1,1,1]]
再创建6个内核,每个内核旋转90度主内核
- 应用命中或未命中创建 8 个输出图像
- 将这些图像相加并减去输入图像的结果生成输出图像
- 验证输出图像是否等于输入图像
- 输入图像变成输出图像
- 在输入和输出图像之间没有差异时重复
这是一些测试代码:
import cv2 as cv
import numpy as np
input_image = cv.imread('x.png',0)
_,input_image = cv.threshold(input_image,60,255,cv.THRESH_BINARY)
kernel1 = np.array((
[0, 0, 0],
[-1, 1, -1],
[1, 1, 1]), dtype="int")
kernel2 = np.array((
[-1, 0, 0],
[1, 1, 0],
[-1, 1, -1]), dtype="int")
kernel3 = np.rot90(kernel1)
kernel4 = np.rot90(np.rot90(kernel1))
kernel5 = np.rot90(np.rot90(np.rot90(kernel1)))
kernel6 = np.rot90(kernel2)
kernel7 = np.rot90(np.rot90(kernel2))
kernel8 = np.rot90(np.rot90(np.rot90(kernel2)))
output_image_1 = cv.morphologyEx(input_image, cv.MORPH_HITMISS, kernel1)
output_image_2 = cv.morphologyEx(input_image, cv.MORPH_HITMISS, kernel2)
output_image_3 = cv.morphologyEx(input_image, cv.MORPH_HITMISS, kernel3)
output_image_4 = cv.morphologyEx(input_image, cv.MORPH_HITMISS, kernel4)
output_image_5 = cv.morphologyEx(input_image, cv.MORPH_HITMISS, kernel5)
output_image_6 = cv.morphologyEx(input_image, cv.MORPH_HITMISS, kernel6)
output_image_7 = cv.morphologyEx(input_image, cv.MORPH_HITMISS, kernel7)
output_image_8 = cv.morphologyEx(input_image, cv.MORPH_HITMISS, kernel8)
hit_miss = output_image_1 + output_image_2 + output_image_3 + output_image_4 + output_image_5 + output_image_6 + output_image_7 + output_image_8
output_image = input_image - hit_miss
while not np.array_equal(output_image, input_image):
input_image = output_image
output_image_1 = cv.morphologyEx(input_image, cv.MORPH_HITMISS, kernel1)
output_image_2 = cv.morphologyEx(input_image, cv.MORPH_HITMISS, kernel2)
output_image_3 = cv.morphologyEx(input_image, cv.MORPH_HITMISS, kernel3)
output_image_4 = cv.morphologyEx(input_image, cv.MORPH_HITMISS, kernel4)
output_image_5 = cv.morphologyEx(input_image, cv.MORPH_HITMISS, kernel5)
output_image_6 = cv.morphologyEx(input_image, cv.MORPH_HITMISS, kernel6)
output_image_7 = cv.morphologyEx(input_image, cv.MORPH_HITMISS, kernel7)
output_image_8 = cv.morphologyEx(input_image, cv.MORPH_HITMISS, kernel8)
hit_miss = output_image_1 + output_image_2 + output_image_3 + output_image_4 + output_image_5 + output_image_6 + output_image_7 + output_image_8
output_image = input_image - hit_miss
cv.imshow("hit_miss", hit_miss)
cv.imshow("out", output_image)
cv.waitKey(0)
cv.destroyAllWindows()
我希望从我的输入中得到一个薄的 X 图像,但代码无法停止运行。我错过了什么吗?
【问题讨论】:
-
您的代码有错误。原始来源一个接一个地应用结构元素,而不是同时应用。您不应该将
output_image_Ns 加在一起,而是在每个morphologyEx 调用之后计算input_image-output_image_N并将其用作下一步的输入。如果不进行此更改,此代码会导致原始形状断开连接。