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

如何设置合适的cv2颜色范围以提取图像中的沙漠区域?

解决方案:精准过滤沙漠区域

针对你需要保留图像中米色、棕褐色沙漠区域,过滤其他内容的需求,当前使用RGB颜色范围的方案存在局限性——RGB颜色空间受光照、亮度影响大,难以精准匹配沙漠的色调。推荐改用HSV颜色空间来实现更稳定的颜色过滤,以下是具体方案:

一、调整为HSV颜色空间的过滤方案

HSV将颜色分为色调(Hue)、饱和度(Saturation)、明度(Value)三个维度,对同色系颜色的区分更直观,适合场景颜色过滤。

1. 推荐的沙漠区域HSV范围

针对你提供的沙漠图像,可尝试以下初始HSV阈值(可根据实际图像微调):

self.lower_hsv = np.array([0, 20, 70])
self.upper_hsv = np.array([30, 255, 255])
  • 色调H:0-30覆盖了从米色到棕褐色的暖色调区间
  • 饱和度S:20-255过滤掉过灰、过淡的非沙漠区域
  • 明度V:70-255避免过暗的阴影或无关暗区

2. 修改后的transform_image方法

将颜色空间转换为HSV,并生成掩码,还可添加形态学操作优化掩码(去除噪声、填补漏洞):

def transform_image(self, image):
    # 将ImageGrab获取的RGB图像转换为cv2默认的BGR格式
    image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
    hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
    
    # 生成颜色掩码
    mask = cv2.inRange(hsv_image, self.lower_hsv, self.upper_hsv)
    
    # 形态学操作优化掩码:先腐蚀去噪声,再膨胀补漏洞
    kernel = np.ones((3,3), np.uint8)
    mask = cv2.erode(mask, kernel, iterations=1)
    mask = cv2.dilate(mask, kernel, iterations=1)
    
    # 调整掩码尺寸
    mask = cv2.resize(mask, dsize=self.output_size, interpolation=cv2.INTER_CUBIC)
    
    # 若需保留原图像的沙漠区域,可启用以下代码返回过滤后的图像
    # filtered_image = cv2.bitwise_and(image, image, mask=mask)
    # filtered_image = cv2.resize(filtered_image, dsize=self.output_size, interpolation=cv2.INTER_CUBIC)
    # return filtered_image
    
    return mask

二、手动校准颜色范围的工具

如果初始范围仍不符合需求,可使用以下交互式工具,通过滑动条实时调整HSV参数,找到最适合的阈值:

import cv2
import numpy as np

def nothing(x):
    pass

# 加载你的测试图像(替换为实际路径)
image = cv2.imread("your_test_image.jpg")
hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)

# 创建校准窗口与滑动条
cv2.namedWindow("HSV Calibrator")
cv2.createTrackbar("H Lower", "HSV Calibrator", 0, 179, nothing)
cv2.createTrackbar("H Upper", "HSV Calibrator", 30, 179, nothing)
cv2.createTrackbar("S Lower", "HSV Calibrator", 20, 255, nothing)
cv2.createTrackbar("S Upper", "HSV Calibrator", 255, 255, nothing)
cv2.createTrackbar("V Lower", "HSV Calibrator", 70, 255, nothing)
cv2.createTrackbar("V Upper", "HSV Calibrator", 255, 255, nothing)

while True:
    # 获取滑动条参数
    h_low = cv2.getTrackbarPos("H Lower", "HSV Calibrator")
    h_high = cv2.getTrackbarPos("H Upper", "HSV Calibrator")
    s_low = cv2.getTrackbarPos("S Lower", "HSV Calibrator")
    s_high = cv2.getTrackbarPos("S Upper", "HSV Calibrator")
    v_low = cv2.getTrackbarPos("V Lower", "HSV Calibrator")
    v_high = cv2.getTrackbarPos("V Upper", "HSV Calibrator")
    
    # 生成实时掩码
    lower = np.array([h_low, s_low, v_low])
    upper = np.array([h_high, s_high, v_high])
    mask = cv2.inRange(hsv_image, lower, upper)
    
    # 显示预览
    cv2.imshow("Original", image)
    cv2.imshow("Mask", mask)
    
    # 按ESC退出并输出最终参数
    if cv2.waitKey(1) == 27:
        print(f"最终HSV范围:lower = np.array([{h_low}, {s_low}, {v_low}]), upper = np.array([{h_high}, {s_high}, {v_high}])")
        break

cv2.destroyAllWindows()

三、额外优化建议

  • 若图像光照不均,可对HSV的V通道做直方图均衡化,提升颜色区分度
  • 若沙漠区域存在阴影,可适当降低V通道的下限值,避免阴影被误过滤

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 01:52:15