如何在Python中同时更改图像不同色相?例:红转绿、绿转红
解决图像特定色相区域互换的问题
直接交换RGB通道的方式之所以失败,是因为它会全局互换所有像素的红绿色通道,而非仅针对红色和绿色的区域。比如原本的黄色(R+G混合)会保持黄色,但原本的红色纯像素会变成绿色、绿色纯像素变成红色,中间混合色的混乱会导致整体色调偏棕。正确的做法是利用HSV颜色空间的色相(H)通道,精准定位目标颜色区域后修改色相。
实现步骤
- 将图像转换到HSV空间,H通道直接对应色相,便于单独修改特定颜色
- 定义红色和绿色的色相范围,生成对应掩码
- 对红色区域的色相值修改为绿色对应的色相,绿色区域的色相修改为红色对应的色相
- 转换回RGB空间查看结果
完整代码
import cv2 import matplotlib.pyplot as plt # 读取图像并转换为RGB PEP = cv2.imread("PEP.jpg") PEP_rgb = cv2.cvtColor(PEP, cv2.COLOR_BGR2RGB) # 转换到HSV空间 PEP_hsv = cv2.cvtColor(PEP_rgb, cv2.COLOR_RGB2HSV) h, s, v = cv2.split(PEP_hsv) # 定义红色的色相范围(OpenCV中H范围0-179) lower_red1 = (0, 120, 70) upper_red1 = (10, 255, 255) lower_red2 = (170, 120, 70) upper_red2 = (180, 255, 255) # 定义绿色的色相范围 lower_green = (40, 40, 40) upper_green = (70, 255, 255) # 生成红色区域掩码 mask_red1 = cv2.inRange(PEP_hsv, lower_red1, upper_red1) mask_red2 = cv2.inRange(PEP_hsv, lower_red2, upper_red2) mask_red = cv2.bitwise_or(mask_red1, mask_red2) # 生成绿色区域掩码 mask_green = cv2.inRange(PEP_hsv, lower_green, upper_green) # 修改色相:红色区域转为绿色(H=60),绿色区域转为红色(H=0) h[mask_red > 0] = 60 h[mask_green > 0] = 0 # 合并HSV通道并转回RGB modified_hsv = cv2.merge((h, s, v)) result_rgb = cv2.cvtColor(modified_hsv, cv2.COLOR_HSV2RGB) # 显示原图和结果 plt.figure(figsize=(12, 6)) plt.subplot(121) plt.imshow(PEP_rgb) plt.title("原图") plt.axis('off') plt.subplot(122) plt.imshow(result_rgb) plt.title("红绿色相互换结果") plt.axis('off') plt.show()
代码说明
- HSV空间转换:HSV的H通道独立控制色相,不会像RGB那样受其他通道干扰,是颜色区域修改的首选空间。
- 掩码生成:红色在H环上分为两段(0-10和170-180),需要用两个范围合并掩码;绿色的色相范围大致在40-70之间,可根据你的实际图像调整阈值。
- 色相修改:直接将红色区域的H值设为60(绿色对应的色相),绿色区域的H值设为0(红色对应的色相),这样只会修改目标区域的颜色,其他颜色不受影响。
内容的提问来源于stack exchange,提问作者kiana jahanshid
相关产品推荐
相关产品推荐

