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

使用OpenCV Python读取PNG时仅去除棋盘格图案的问题

问题:去除棋盘格图案时阈值处理误选部分像素

我在去除棋盘格图案时遇到问题,使用cv2.threshold进行处理,但误选中了部分像素(红色标记处)。

输入图像

输入图像

输出图像(误选像素已标记)

输出图像

相关代码

import cv2
import numpy as np

input = cv2.imread('image.png')
ret, logo_mask = cv2.threshold(input[:,:,0], 0, 255, cv2.THRESH_BINARY|cv2.THRESH_OTSU)
cv2.imshow(logo_mask)

解决思路与优化代码

原因分析

直接对蓝通道(input[:,:,0])执行Otsu阈值分割时,棋盘格与误选区域的蓝通道灰度值接近,导致被误划分为前景。可以通过更换通道、结合形态学操作或颜色范围筛选来修正。

优化方案1:换用绿色通道+形态学操作

棋盘格与目标区域在绿色通道的灰度差异更显著,搭配开运算可去除小噪点:

import cv2
import numpy as np

# 避免使用Python内置关键字input作为变量名
input_img = cv2.imread('image.png')
# 改用绿色通道做反向阈值分割,让目标区域为白色
ret, logo_mask = cv2.threshold(input_img[:,:,1], 0, 255, cv2.THRESH_BINARY_INV|cv2.THRESH_OTSU)
# 3x3核开运算,消除误选的小像素点
kernel = np.ones((3,3), np.uint8)
logo_mask = cv2.morphologyEx(logo_mask, cv2.MORPH_OPEN, kernel)

cv2.imshow('Corrected Mask', logo_mask)
cv2.waitKey(0)
cv2.destroyAllWindows()

优化方案2:HSV颜色范围提取

目标区域颜色特征明确时,转HSV空间做颜色阈值筛选更精准:

import cv2
import numpy as np

input_img = cv2.imread('image.png')
# 转换到HSV空间,颜色区分度更高
hsv_img = cv2.cvtColor(input_img, cv2.COLOR_BGR2HSV)
# 设定目标区域的HSV范围(可根据实际图像微调)
lower_bound = np.array([0, 0, 180])
upper_bound = np.array([180, 255, 255])
logo_mask = cv2.inRange(hsv_img, lower_bound, upper_bound)
# 闭运算填补目标区域的微小孔洞
kernel = np.ones((2,2), np.uint8)
logo_mask = cv2.morphologyEx(logo_mask, cv2.MORPH_CLOSE, kernel)

cv2.imshow('Color-based Mask', logo_mask)
cv2.waitKey(0)
cv2.destroyAllWindows()

内容的提问来源于stack exchange,提问作者dip deb

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 07:31:06