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

如何用OpenCV和Python通过HSV参数将红色矩形转为蓝色并保存?

解决方案

要完成将图像中红色矩形转为蓝色的任务,你需要分三步:定位红色矩形区域、对目标区域的HSV值进行调整、转回RGB并保存结果。以下是完整代码和细节说明:


1. 关键注意事项

OpenCV中的HSV范围和你使用的归一化0-1范围不同:

  • H通道:0179(对应0360度)
  • S通道:0255(对应01)
  • V通道:0255(对应01)

需要先把你的参数转换成OpenCV兼容的数值:

  • H调整量 -0.3333(归一化)对应:-0.3333 * 180 ≈ -60
  • S调整量 -0.05 对应:-0.05 * 255 ≈ -13
  • V调整量 -0.05 对应:-0.05 * 255 ≈ -13

另外,红色在HSV中是环形区间,需要覆盖两个范围才能完整捕捉。


2. 完整代码

import cv2
import numpy as np

# 读取图像(用原始字符串避免路径转义问题)
image = cv2.imread(r'C:\projects\red.jpg')
if image is None:
    raise ValueError("无法读取图像,请检查路径是否正确")

# 转换为HSV格式
hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)

# 定义红色的HSV范围(OpenCV格式)
lower_red1 = np.array([0, 120, 70])
upper_red1 = np.array([10, 255, 255])
lower_red2 = np.array([170, 120, 70])
upper_red2 = np.array([180, 255, 255])

# 创建红色区域的掩码
mask1 = cv2.inRange(hsv_image, lower_red1, upper_red1)
mask2 = cv2.inRange(hsv_image, lower_red2, upper_red2)
red_mask = cv2.bitwise_or(mask1, mask2)

# 拆分HSV通道
h, s, v = cv2.split(hsv_image)

# 调整H通道:处理环形溢出,确保值在0-179之间
h_adjusted = np.where(red_mask > 0, (h - 60) % 180, h)

# 调整S和V通道:避免数值低于0
s_adjusted = np.where(red_mask > 0, np.maximum(s - 13, 0), s)
v_adjusted = np.where(red_mask > 0, np.maximum(v - 13, 0), v)

# 合并调整后的通道
adjusted_hsv = cv2.merge([h_adjusted, s_adjusted, v_adjusted])

# 转回BGR格式
result_image = cv2.cvtColor(adjusted_hsv, cv2.COLOR_HSV2BGR)

# 保存结果
cv2.imwrite(r'C:\projects\blue_rectangle.jpg', result_image)

# 显示对比
cv2.imshow('Original', image)
cv2.imshow('Result', result_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

3. 代码说明

  • 路径处理:用原始字符串r'路径'避免Windows路径的转义字符冲突
  • 红色掩码:覆盖HSV中红色的两个区间(0-10和170-180),确保不会遗漏红色区域
  • H通道调整:用% 180处理环形溢出问题,比如H=5时减60会变成-55,取模后得到125,保证数值在合法范围内
  • S/V通道调整:用np.maximum确保调整后的数值不会低于0,避免出现异常暗部
  • 掩码应用:仅对红色区域(掩码为255的部分)进行颜色调整,其余区域保持原样

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 05:10:50