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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 23:30:46