如何用OpenCV识别带白色边框的深灰色填充矩形
用OpenCV识别带特定颜色的目标矩形
核心思路
目标矩形是白色边框+深灰色填充,背景为黑色,所以可以分两步:先定位矩形轮廓,再验证轮廓的边框色与内部填充色。
具体实现步骤
1. 预处理图像(保留彩色信息)
别直接转灰度图,先对彩色图做模糊处理,保留颜色通道方便后续颜色判断:
import cv2 import numpy as np # 读取图像 img = cv2.imread("your_image_path.png") # 高斯模糊去噪,同时保留颜色信息 blurred = cv2.GaussianBlur(img, (5,5), 0)
2. 提取白色边框的矩形轮廓
白色在BGR色彩空间中为(255,255,255),先生成白色掩码,再从中提取轮廓:
# 定义白色的BGR阈值范围(可根据实际图像微调) lower_white = np.array([200,200,200]) upper_white = np.array([255,255,255]) white_mask = cv2.inRange(blurred, lower_white, upper_white) # 提取轮廓,只保留最外层 contours, _ = cv2.findContours(white_mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
接着用你之前的方法筛选矩形轮廓:
target_candidates = [] for cnt in contours: perimeter = cv2.arcLength(cnt, True) approx = cv2.approxPolyDP(cnt, 0.02*perimeter, True) # 筛选四边形+过滤过小的噪点轮廓 if len(approx) == 4 and cv2.contourArea(cnt) > 1000: target_candidates.append(approx)
3. 验证内部深灰色填充
对每个候选矩形,提取内部区域的颜色均值,判断是否符合深灰色范围:
# 定义深灰色的BGR阈值范围(可根据实际图像微调) lower_gray = np.array([50,50,50]) upper_gray = np.array([100,100,100]) for cnt in target_candidates: # 获取矩形的边界框 x,y,w,h = cv2.boundingRect(cnt) # 提取内部区域(缩小范围,避免边框的白色干扰颜色判断) roi = img[y+5:y+h-5, x+5:x+w-5] # 计算ROI区域的颜色均值 avg_color = cv2.mean(roi)[:3] # 判断是否在深灰色范围内 if (lower_gray <= avg_color).all() and (avg_color <= upper_gray).all(): # 符合条件,绘制绿色标记 cv2.drawContours(img, [cnt], -1, (0,255,0), 2) print("找到目标矩形") # 展示结果 cv2.imshow("Result", img) cv2.waitKey(0) cv2.destroyAllWindows()
4. 补充优化方案
如果白色边框不明显,也可以先提取所有矩形轮廓,再分别验证:
- 边框色:提取轮廓边缘的像素点,判断是否以白色为主
- 填充色:提取内部区域的颜色均值,判断是否为深灰色
关键注意事项
- 颜色阈值范围要根据实际图像调整,不同图像的深灰、白色可能存在差异
- 提取内部ROI时缩小范围,避免边框的白色干扰颜色判断
- 可结合面积、长宽比等条件进一步过滤非目标矩形
内容的提问来源于stack exchange,提问作者Geani Orlando
相关产品推荐
相关产品推荐

