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

如何用Python OpenCV提取半透明红色矩形框内的图像?

提取半透明红色矩形框内的图像内容(OpenCV Python实现)

针对半透明红色矩形框的提取难点,我们可以通过颜色空间转换、形态学操作和轮廓筛选来精准定位并提取框内内容,以下是分步实现方案:

1. 图像读取与颜色空间转换

优先使用HSV颜色空间,它能有效分离颜色信息与亮度,对半透明这类颜色混合的场景更鲁棒:

import cv2
import numpy as np

# 读取目标图像
img = cv2.imread('target_image.jpg')
# 从BGR转换为HSV(OpenCV默认读取格式为BGR)
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

2. 半透明红色的掩码生成

红色在HSV中分为两个区间(H通道是环形),结合半透明特性调整饱和度(S)和亮度(V)的范围,生成红色区域掩码:

# 定义半透明红色的HSV范围(可根据实际图像微调)
lower_red1 = np.array([0, 40, 90])
upper_red1 = np.array([10, 255, 255])
lower_red2 = np.array([170, 40, 90])
upper_red2 = np.array([180, 255, 255])

# 生成两个区间的掩码并合并
mask1 = cv2.inRange(hsv, lower_red1, upper_red1)
mask2 = cv2.inRange(hsv, lower_red2, upper_red2)
red_mask = cv2.bitwise_or(mask1, mask2)

# 形态学闭操作:填充框内小空隙,去除零散噪点
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))
red_mask = cv2.morphologyEx(red_mask, cv2.MORPH_CLOSE, kernel)

3. 筛选矩形轮廓

从掩码中提取轮廓,通过多边形近似筛选出矩形形状的轮廓(排除其他红色噪点):

# 提取外部轮廓
contours, _ = cv2.findContours(red_mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

rect_contours = []
for cnt in contours:
    # 计算轮廓周长,用于多边形近似
    perimeter = cv2.arcLength(cnt, True)
    # 多边形近似(0.02为近似系数,可微调)
    approx = cv2.approxPolyDP(cnt, 0.02 * perimeter, True)
    # 筛选4个顶点的轮廓,且面积足够大(排除小噪点)
    if len(approx) == 4 and cv2.contourArea(cnt) > 1000:
        rect_contours.append(approx)

4. 提取框内内容

根据矩形是否为轴对齐,选择不同的提取方式:

轴对齐矩形(直接裁剪)

如果矩形是正的,直接通过边界框裁剪:

for idx, rect in enumerate(rect_contours):
    x, y, w, h = cv2.boundingRect(rect)
    # 裁剪框内区域
    roi = img[y:y+h, x:x+w]
    # 保存结果
    cv2.imwrite(f'roi_{idx}.jpg', roi)

旋转矩形(透视变换转正)

如果矩形是倾斜的,通过透视变换将其转为正矩形后提取:

def order_points(pts):
    # 对矩形顶点排序:左上、右上、右下、左下
    rect = np.zeros((4, 2), dtype="float32")
    s = pts.sum(axis=1)
    rect[0] = pts[np.argmin(s)]
    rect[2] = pts[np.argmax(s)]
    diff = np.diff(pts, axis=1)
    rect[1] = pts[np.argmin(diff)]
    rect[3] = pts[np.argmax(diff)]
    return rect

def four_point_transform(image, pts):
    rect = order_points(pts)
    tl, tr, br, bl = rect
    # 计算目标矩形的宽高
    max_width = max(int(np.linalg.norm(br - bl)), int(np.linalg.norm(tr - tl)))
    max_height = max(int(np.linalg.norm(tr - br)), int(np.linalg.norm(tl - bl)))
    # 定义目标点坐标
    dst = np.array([[0, 0], [max_width-1, 0], [max_width-1, max_height-1], [0, max_height-1]], dtype="float32")
    # 生成透视变换矩阵并应用
    M = cv2.getPerspectiveTransform(rect, dst)
    warped = cv2.warpPerspective(image, M, (max_width, max_height))
    return warped

# 处理每个旋转矩形
for idx, rect in enumerate(rect_contours):
    pts = rect.reshape(4, 2)
    roi = four_point_transform(img, pts)
    cv2.imwrite(f'warped_roi_{idx}.jpg', roi)

微调建议

  • 如果掩码仍包含无关红色区域:调整HSV的S、V阈值(半透明红色的饱和度通常偏低),或缩小H通道的范围。
  • 如果轮廓检测不准确:调整approxPolyDP的近似系数,或修改轮廓面积阈值(根据图像中矩形的实际大小)。
  • 如果形态学操作过度:更换更小的核(如(3,3))或调整操作次数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 15:00:53