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

图像白色标记区域提取效果不稳定,求代码优化建议

提取图像中白色标记区域的优化方案

待处理图片

我需要技术帮助。我希望从附件图像中仅提取白色标记部分。我的思路是基于RGB 255,255,255识别并裁剪白色区域,但该方法在部分场景下效果不佳。

原代码存在的问题

  1. RGB阈值过于严苛:实际场景中白色区域可能因光照、图像压缩等因素,RGB值并非严格的253-255,导致漏识别。
  2. 亮度增强参数固定:固定的alpha=1.2和beta=20无法适配所有图片,可能导致部分图片过曝或增强效果不足。
  3. 轮廓处理逻辑不完善:仅取最大轮廓但未过滤小噪点,容易误裁剪;同时代码存在缩进错误和路径未赋值的语法问题。
  4. RGB空间对光照敏感:RGB通道受光照影响大,不如HSV或灰度空间更适合识别亮白色区域。

优化后的代码

import cv2
import numpy as np
import os

# 请替换为实际路径
input_folder = "your_input_folder_path"
output_folder = "your_output_folder_path"

if not os.path.exists(output_folder):
    os.makedirs(output_folder)

# 定义HSV空间的白色范围(更适配光照变化)
lower_hsv_white = np.array([0, 0, 220], dtype=np.uint8)
upper_hsv_white = np.array([180, 30, 255], dtype=np.uint8)

for filename in os.listdir(input_folder):
    img_path = os.path.join(input_folder, filename)
    image = cv2.imread(img_path)

    if image is not None:
        # 转换为HSV空间,更稳定识别亮白色
        hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
        mask = cv2.inRange(hsv_image, lower_hsv_white, upper_hsv_white)

        # 形态学操作:去除小噪点,平滑mask
        kernel = np.ones((3, 3), np.uint8)
        mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel)
        mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel)

        contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

        if contours:
            # 过滤小轮廓,只保留面积大于阈值的区域(根据实际情况调整阈值)
            min_contour_area = 100
            valid_contours = [cnt for cnt in contours if cv2.contourArea(cnt) > min_contour_area]
            
            if valid_contours:
                # 合并所有有效轮廓的外接矩形,得到完整的白色区域范围
                x_min = min([cv2.boundingRect(cnt)[0] for cnt in valid_contours])
                y_min = min([cv2.boundingRect(cnt)[1] for cnt in valid_contours])
                x_max = max([cv2.boundingRect(cnt)[0] + cv2.boundingRect(cnt)[2] for cnt in valid_contours])
                y_max = max([cv2.boundingRect(cnt)[1] + cv2.boundingRect(cnt)[3] for cnt in valid_contours])
                
                cropped_image = image[y_min:y_max, x_min:x_max]
                output_img_path = os.path.join(output_folder, filename)
                cv2.imwrite(output_img_path, cropped_image)
            else:
                print(f"No valid contours found for {filename}")
        else:
            print(f"No contours found for {filename}")
    else:
        print(f"Could not load image {filename}")

优化点说明

  • 改用HSV空间识别:利用HSV的V(亮度)通道捕捉亮白色,H和S通道限制低饱和度,适配不同光照下的白色区域。
  • 形态学操作:通过开运算(先腐蚀后膨胀)去除小噪点,闭运算填补区域内的小空洞,让mask更准确。
  • 轮廓过滤:设置最小面积阈值,忽略因噪点产生的微小轮廓。
  • 合并多轮廓区域:如果白色标记分为多个部分,合并所有有效轮廓的外接矩形,确保完整提取目标区域。
  • 修复语法问题:补全路径赋值,修正代码缩进错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 21:42:50