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

如何在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()

代码说明

  1. HSV空间转换:HSV的H通道独立控制色相,不会像RGB那样受其他通道干扰,是颜色区域修改的首选空间。
  2. 掩码生成:红色在H环上分为两段(0-10和170-180),需要用两个范围合并掩码;绿色的色相范围大致在40-70之间,可根据你的实际图像调整阈值。
  3. 色相修改:直接将红色区域的H值设为60(绿色对应的色相),绿色区域的H值设为0(红色对应的色相),这样只会修改目标区域的颜色,其他颜色不受影响。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 09:07:29