OpenCV矩形框检测求助:浅色表格/矩形无法被识别
解决浅色矩形框无法检测的问题
你的核心问题是自适应阈值的反二值化操作把浅色框的轮廓给抹掉了——原代码用THRESH_BINARY_INV会将高灰度的浅色区域转为黑色,后续的填充和开运算直接丢失了这些轮廓的有效信息。
以下是修改后的代码,能同时检测深色和浅色矩形框:
import numpy as np import cv2 # 加载图像 image = cv2.imread("aaaaaaaaaaa.jpg") result = image.copy() gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 增强对比度,提升浅色框与背景的差异(可根据实际情况调整参数) clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8)) gray = clahe.apply(gray) # 自适应阈值(使用THRESH_BINARY,保留浅色区域的白色轮廓) thresh = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 51, 9) # 反转阈值结果,让深色框也变成白色轮廓(统一两种框的检测条件) thresh = cv2.bitwise_not(thresh) # 填充矩形轮廓 cnts = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) cnts = cnts[0] if len(cnts) == 2 else cnts[1] for c in cnts: cv2.drawContours(thresh, [c], -1, (255,255,255), -1) # 形态学开运算,去除噪点(调整核大小适配框的尺寸) kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (7,7)) opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations=2) # 检测并绘制轮廓 cnts = cv2.findContours(opening, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) cnts = cnts[0] if len(cnts) == 2 else cnts[1] area_threshold = 3000 # 根据实际图像大小微调阈值 for c in cnts: if cv2.contourArea(c) > area_threshold: x,y,w,h = cv2.boundingRect(c) cv2.rectangle(image, (x, y), (x + w, y + h), (36,255,12), 3) # 保存结果 cv2.imwrite('thresh.jpg', thresh) cv2.imwrite('opening.jpg', opening) cv2.imwrite('image.jpg', image) cv2.waitKey()
关键改动说明:
- 阈值逻辑调整:先通过
THRESH_BINARY保留浅色框的白色轮廓,再反转阈值结果让深色框也转为白色,统一两种框的检测条件。 - 对比度增强:加入CLAHE自适应直方图均衡,放大浅色框与背景的灰度差异,让轮廓更易被捕捉。
- 形态学参数优化:缩小核尺寸和迭代次数,避免过度操作丢失浅色框的细小轮廓。
- 面积阈值微调:降低阈值适配浅色框的实际大小,避免漏检。
内容的提问来源于stack exchange,提问作者ovu sunday
相关产品推荐
相关产品推荐

