如何使用Python仅对图像中的粗线条应用腐蚀(Erosion)操作
解决方案:仅对粗线条应用腐蚀操作
要实现只腐蚀粗线条、保留细线条的效果,核心思路是先分离出细线条,单独处理粗线条后再合并回去,具体步骤如下:
- 提取细线条:用小尺寸结构元素做开运算,开运算会移除细线条,再用原图减去开运算结果,就能得到纯细线条区域
- 分离粗线条:用原图减去细线条,得到仅包含粗线条的图像
- 腐蚀粗线条:对粗线条图像执行腐蚀操作
- 合并结果:将腐蚀后的粗线条和保留的细线条相加,得到最终图像
完整代码实现:
import cv2 import numpy as np # 读取灰度图像 img = cv2.imread('123.png', 0) # 自适应二值化,确保线条为白色、背景为黑色,可根据实际图像调整阈值 _, binary_img = cv2.threshold( img, 127, 255, cv2.THRESH_BINARY_INV if np.mean(img) > 127 else cv2.THRESH_BINARY ) # 步骤1:提取细线条 small_kernel = np.ones((2, 2), np.uint8) opened = cv2.morphologyEx(binary_img, cv2.MORPH_OPEN, small_kernel) thin_lines = cv2.subtract(binary_img, opened) # 步骤2:分离粗线条 thick_lines = cv2.subtract(binary_img, thin_lines) # 步骤3:腐蚀粗线条(沿用你原有的核参数) erosion_kernel = np.ones((6, 6), np.uint8) eroded_thick = cv2.erode(thick_lines, erosion_kernel, iterations=1) # 步骤4:合并细线条与腐蚀后的粗线条 result = cv2.add(thin_lines, eroded_thick) # 展示结果 cv2.imshow("Original", binary_img) cv2.imshow("Result", result) cv2.waitKey(0) cv2.destroyAllWindows()
关键说明:
- 二值化适配:自动判断背景明暗来选择二值化模式,避免线条和背景颠倒的问题,你可以根据自己的图像调整阈值参数
- 细线条提取:(2,2)的小核刚好能过滤掉细线条,若你的细线条更粗/更细,可微调核的尺寸
- 腐蚀参数:保留了你原有的(6,6)核和迭代次数,可根据粗线条需要腐蚀的程度自行调整
内容的提问来源于stack exchange,提问作者Nivetha Rajendran
相关产品推荐
相关产品推荐

