You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 05:24:02