使用Python OpenCV移除图像中小三角形失败问题求助
存在的问题
- 算子选择错误:形态学闭运算的逻辑是先膨胀后腐蚀,作用是填充前景区域的小孔、连接相邻的前景对象,本身没有「识别并删除特定形状」的能力,你需要的是用于匹配特定二值形状的击中击不中变换,而不是闭运算。
- 自定义核的使用场景错误:你设计的成对三角形模板是用于形状匹配的,而闭运算的核仅用于定义形态学操作的邻域范围,两者的使用逻辑完全不同,直接用自定义核做闭运算不仅无法匹配三角形,还可能改变文字的边缘形态。
- 操作逻辑错误:当前你的处理逻辑是对整张二值图做形态学修改,没有先定位三角形区域再针对性处理,很容易误伤和三角形距离较近的文字笔画。
修正方案
核心逻辑改为「先用击中击不中变换定位所有成对三角形的位置,再对定位到的区域做白色填充」,完全不影响文字区域,修正后的代码如下:
import cv2 import numpy as np # 成对三角形匹配模板,可根据实际三角形尺寸微调 kernel = np.array([ [1,1,0,0,0,0], [1,1,1,1,0,0], [1,1,1,1,1,1], [0,0,0,0,0,0], [0,0,0,0,0,0], [1,1,1,1,1,1], [1,1,1,1,0,0], [1,1,0,0,0,0] ], dtype=np.uint8) src_img = cv2.imread("triangle_and_text.png") gray = cv2.cvtColor(src_img, cv2.COLOR_BGR2GRAY) # 二值反转后,文字和三角形为前景(白色),背景为黑色 thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1] # 1. 用击中击不中变换匹配所有符合模板的三角形区域 hitmiss = cv2.morphologyEx(thresh, cv2.MORPH_HITMISS, kernel) # 2. 找到匹配区域的外接矩形,填充对应位置完成三角形删除 contours = cv2.findContours(hitmiss, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[0] for cnt in contours: x,y,w,h = cv2.boundingRect(cnt) thresh[y:y+h, x:x+w] = 0 # 反转回正常显示颜色保存 result = 255 - thresh cv2.imwrite("removed_triangles.png", result)
可选优化
如果出现匹配遗漏或者误匹配的情况,只需要根据实际图像里三角形的尺寸、上下间距微调kernel的数值,保证模板和实际三角形形状完全一致即可。
内容的提问来源于stack exchange,提问作者Co Worker
相关产品推荐
相关产品推荐

