引自免费微信小程序:皆我百晓生
在Python中,我们可以使用OpenCV库来进行图像处理,包括骨架提取和去毛刺操作。首先确保你已经安装了OpenCV,如果没有,可以使用pip install opencv-python命令进行安装。
下面是一个详细的步骤,演示如何使用OpenCV进行骨架提取和去毛刺的操作:
- 导入必要的库
import cv2
import numpy as np
- 读取图像并转换为灰度图像
img = cv2.imread('image.png', cv2.IMREAD_GRAYSCALE)
- 对图像进行二值化处理(如果还没有二值化)
_, thresh = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY_INV) # 这里使用Otsu's二值化方法
- 使用形态学操作进行开运算,消除小的噪声点
kernel = np.ones((3, 3), np.uint8)
opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel)
- 提取骨架
skel = cv2.ximgproc.thinning(opening, None, 0.7, 3)
- 去毛刺:这里我们可以通过膨胀和腐蚀来尝试去毛刺,但这种方法可能并不完美,因为可能会误删部分骨架。一个更好的方法是使用深度优先搜索(DFS)遍历骨架,并删除那些不符合条件的像素。下面是一个简单的实现:
def remove_stubs(skel):
rows, cols = skel.shape
visited = np.zeros_like(skel)
def dfs(i, j):
if i < 0 or i >= rows or j < 0 or j >= cols or skel[i][j] == 0 or visited[i][j]:
return
visited[i][j] = 1
neighbors = [(i-1, j), (i+1, j), (i, j-1), (i, j+1)]
for neighbor in neighbors:
if skel[neighbor[0]][neighbor[1]] != 0 and not visited[neighbor[0]][neighbor[1]]:
dfs(*neighbor)
for i in range(rows):
for j in range(cols):
if skel[i][j] != 0 and not visited[i][j]:
dfs(i, j)
return ~visited.astype(np.uint8) * 255
clean_skeleton = remove_stubs(skel)
- 最后显示原始骨架和去毛刺后的骨架
cv2.imshow("Original Skeleton", skel)
cv2.imshow("Cleaned Skeleton", clean_skeleton)
cv2.waitKey(0)
cv2.destroyAllWindows()
注意:这个去毛刺的方法并不是完美的,对于复杂的场景可能效果不佳。如果你需要更精确的结果,可能需要结合其他算法,例如基于连通组件分析或者其他机器学习方法。上述代码只是一个基础示例,实际应用中可能需要根据具体情况进行调整。
