如何使用mask对图像指定对象(如头发)重上色并获得真实改色效果?
头发改色代码问题修复方案
你现有代码存在以下可直接导致效果异常的问题:
- 第一版HSV改色代码的致命错误:完成HSV三通道数值修改后,调用
cv2.cvtColor时错误传入了未修改的res变量而非调整后的hsv变量,所有HSV调整逻辑实际未生效 - HSV色彩空间的H(色相)通道取值范围为0-179,直接做加法会导致数值溢出被OpenCV截断,无法得到预期色相
- 直接提取头发区域修改后未和原图融合,会导致非头发区域变黑
- 第二版直接相乘的方案会完全丢失原图头发的光影、明暗层次,自然会出现假色效果,需要保留原图的明度、饱和度信息,仅替换色相或者用混合模式叠加目标色
修复后可实现预期效果的代码
HSV调整方案
import cv2 import numpy as np from matplotlib import pyplot as plt # 读取并预处理原图 img = cv2.imread('model-demo.jpg') img = cv2.resize(img, (256, 256)) img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 处理头发mask(需确保mask_hair已提前正确读取) _, mask_hair = cv2.threshold(mask_hair, thresh=210, maxval=255, type=cv2.THRESH_BINARY) mask_3ch = cv2.cvtColor(mask_hair, cv2.COLOR_GRAY2BGR) // 255 # 原图转HSV,仅修改头发区域的HSV值 hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # 色相调整后取模避免溢出 hsv[..., 0] = np.where(mask_hair == 255, (hsv[..., 0] + 120) % 180, hsv[..., 0]) # 饱和度、明度调整做数值截断避免超出0-255范围 hsv[..., 1] = np.where(mask_hair == 255, np.clip(hsv[..., 1] + 60, 0, 255), hsv[..., 1]) hsv[..., 2] = np.where(mask_hair == 255, np.clip(hsv[..., 2] - 20, 0, 255), hsv[..., 2]) # 转回到RGB空间后和原图融合 modified_hair = cv2.cvtColor(hsv, cv2.COLOR_HSV2RGB) result = np.where(mask_3ch == 1, modified_hair, img_rgb) plt.imshow(result) plt.axis('off') plt.show()
纯色叠加方案
如果需要固定某一种目标色,可以用alpha混合代替直接相乘,保留原图光影层次:
import cv2 import numpy as np from matplotlib import pyplot as plt img = cv2.resize(cv2.imread('model-demo.jpg'),(256,256)) img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 读取单通道mask mask_hair = cv2.resize(cv2.imread('./mask.jpg', 0),(256,256)) _, mask_hair = cv2.threshold(mask_hair, 210, 255, cv2.THRESH_BINARY) # 目标色:此处为示例绿色,可自行替换 target_color = [0, 255, 0] color_layer = np.full_like(img_rgb, target_color) # alpha为目标色的透明度,调整数值可控制改色浓度,0.5为半透明叠加 alpha = 0.5 mixed = cv2.addWeighted(img_rgb, 1-alpha, color_layer, alpha, 0) # 仅保留头发区域的混合效果,其余区域用原图 result = np.where(mask_hair[..., None] == 255, mixed, img_rgb) plt.imshow(result) plt.axis('off') plt.show()
相关参考图
- 原始图像:

- 原代码输出结果:

- 预期输出效果:

- 纯色mask参考:

内容的提问来源于stack exchange,提问作者MSI
相关产品推荐
相关产品推荐

