如何用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
相关产品推荐
相关产品推荐

