opencv实现图像骨架提取
文章目录
-
一.图像骨架提取
-
二.ximgproc.thinning
-
三.使用腐蚀和开运算实现
一.图像骨架提取
骨架提取,也叫二值图像细化。这种算法能将一个连通区域细化成一个像素的宽度,用于特征提取和目标拓扑表示。
二.ximgproc.thinning
下载包opencv-contrib-python,更新到最新版本,即可使用ximgproc.thinning。关于部分帖子说opencv-contrib-python和python-opencv不能共存实为谬论。
import cv2
import numpy as np
img = cv2.imread('filename', 0)
skeleton = np.zeros_like(img)
skeleton = cv2.ximgproc.thinning(img, skeleton)
cv2.imshow("filename",skeleton)
cv2.waitKey(0)
cv2.destroyAllWindows()
三.使用腐蚀和开运算实现
对一个图像不断腐蚀直到为空,在每次腐蚀过程中执行如下步骤:
1.对腐蚀的图像进行开运算,
2.用开运算前的图像减去开运算后的图像,
3.将步骤2得到的图像累加,
步骤3中累加的图案即为骨架。
import cv2
import numpy as np
img = cv2.imread('filename', cv2.IMREAD_GRAYSCALE)
dst = img.copy()
skeleton = np.zeros(dst.shape, np.uint8)
while True:
if np.sum(dst) == 0:
break
kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (3, 3))
# 腐蚀
dst = cv2.erode(dst, kernel)
# 开运算
open_dst = cv2.morphologyEx(dst, cv2.MORPH_OPEN, kernel)
# 原图像减去开运算
result = dst - open_dst
# 累加
skeleton = skeleton + result
cv2.imwrite("filename", skeleton)