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

基于OpenCV的HSV多区间颜色分类实现技术咨询

嘿,这个问题我熟!我来给你一套高效的OpenCV实现方案,完全不用多余循环,直接靠API和向量运算搞定~

核心思路

我们要做的就是:先把图像转成HSV空间,用cv2.inRange生成每个颜色的二值掩码,再通过矩阵运算把这些掩码转换成对应的索引值(0/1/2/3),最后合并成一张索引图。全程都是OpenCV和numpy的底层向量操作,没有Python层面的循环开销,速度拉满。

完整代码实现

import cv2
import numpy as np

# 读取图像并转HSV
img = cv2.imread("your_image_path.jpg")
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

# 定义4个HSV颜色区间(按你的需求调整,示例包含你提到的蓝色)
color_ranges = [
    # color0: 蓝色(对应索引0)
    ((110, 100, 100), (130, 255, 255)),
    # color1: 红色(对应索引1,红色分两个区间,这里合并)
    ((0, 100, 100), (10, 255, 255)),
    ((170, 100, 100), (180, 255, 255)),
    # color2: 黄色(对应索引2)
    ((20, 100, 100), (30, 255, 255)),
    # color3: 绿色(对应索引3)
    ((50, 100, 100), (70, 255, 255))
]

# 生成每个颜色的掩码(转成0/1的二值图,方便后续运算)
masks = []
# 单独处理红色的双区间,其他颜色直接生成掩码
mask0 = cv2.inRange(hsv, np.array(color_ranges[0][0]), np.array(color_ranges[0][1]))
masks.append(mask0 // 255)

mask1_low = cv2.inRange(hsv, np.array(color_ranges[1][0]), np.array(color_ranges[1][1]))
mask1_high = cv2.inRange(hsv, np.array(color_ranges[2][0]), np.array(color_ranges[2][1]))
mask1 = cv2.bitwise_or(mask1_low, mask1_high)
masks.append(mask1 // 255)

mask2 = cv2.inRange(hsv, np.array(color_ranges[3][0]), np.array(color_ranges[3][1]))
masks.append(mask2 // 255)

mask3 = cv2.inRange(hsv, np.array(color_ranges[4][0]), np.array(color_ranges[4][1]))
masks.append(mask3 // 255)

# 生成最终的索引图:每个掩码乘以对应的索引后相加
result = np.zeros_like(hsv[:, :, 0], dtype=np.uint8)
for idx, mask in enumerate(masks):
    result += mask * idx

# 可选:显示结果
cv2.imshow("Color Index Map", result)
cv2.waitKey(0)
cv2.destroyAllWindows()

关键细节说明

  1. 掩码处理:把cv2.inRange生成的0/255掩码转成0/1,这样乘以索引后不会出现数值溢出,而且矩阵运算更高效。
  2. 多区间颜色处理:比如红色在HSV里分两个区间(0-10和170-180),用cv2.bitwise_or合并两个掩码即可。
  3. 无循环开销:除了生成4个掩码的简单步骤(仅4次操作,可忽略),核心的索引赋值是numpy向量运算,完全避开了Python级别的逐像素循环。
  4. 为什么之前的addWeighted没成功?:addWeighted是做加权融合,你可能直接用了原始的0/255掩码,数值太大导致结果不对。换成0/1掩码后,直接乘以索引再相加,效果和加权融合一致,但更直观高效。

自定义调整

你只需要修改color_ranges里的HSV上下限,对应你的4个目标颜色就行。如果颜色没有多区间,直接去掉红色那段的特殊处理,按颜色0的方式生成掩码即可。

内容的提问来源于stack exchange,提问作者Surfer on the fall

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:23:00