使用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
相关产品推荐
相关产品推荐

