PyTorch图像蓝化实现求助:transforms色调调整后颜色异常问题
解决方案
方案1:RGB通道加权增强蓝色
直接调整图像的RGB通道权重,降低红、绿色通道的亮度,同时提升蓝色通道的亮度,能让整体画面偏蓝,且不会出现色相偏移导致的怪异色调。
自定义Transform类代码:
import torch from torchvision import transforms from PIL import Image class BlueEnhanceTransform: def __init__(self, blue_factor=1.5, red_green_factor=0.8): # blue_factor: 蓝色通道增强倍数,大于1为增强 # red_green_factor: 红、绿色通道衰减倍数,小于1为减弱 self.blue_factor = blue_factor self.red_green_factor = red_green_factor def __call__(self, img): # 将PIL图像转为PyTorch张量,形状为(C, H, W),数值范围[0,1] tensor_img = transforms.ToTensor()(img) # 调整通道权重 tensor_img[0] *= self.red_green_factor # 红色通道索引0 tensor_img[1] *= self.red_green_factor # 绿色通道索引1 tensor_img[2] *= self.blue_factor # 蓝色通道索引2 # 限制数值在[0,1]区间,避免颜色溢出失真 tensor_img = torch.clamp(tensor_img, 0.0, 1.0) # 转回PIL图像(如果后续变换需要PIL格式,否则可直接返回张量) return transforms.ToPILImage()(tensor_img)
使用方式:
# 组合图像变换流程 transform = transforms.Compose([ transforms.Resize((224, 224)), BlueEnhanceTransform(blue_factor=1.6, red_green_factor=0.7), # 按需调整参数 transforms.ToTensor(), transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) ]) # 加载数据集 from torchvision import datasets dataset = datasets.ImageFolder(root='你的数据集路径', transform=transform)
方案2:HSV空间定向调整为蓝色调
如果需要更精准的蓝色色调控制,可以将图像转换到HSV色彩空间,直接将色相调整到蓝色范围,同时增强饱和度让蓝色更突出。
自定义Transform类代码:
class BlueTintTransform: def __init__(self, hue_target=0.6, saturation_boost=1.2, value_keep=1.0): # hue_target: 蓝色对应的色相值(HSV色相范围0-1,对应0-360度,蓝色约为0.6) # saturation_boost: 饱和度增强倍数,提升蓝色鲜艳度 # value_keep: 明度保持倍数,避免过亮或过暗 self.hue_target = hue_target self.saturation_boost = saturation_boost self.value_keep = value_keep def __call__(self, img): # 转换为HSV模式 hsv_img = img.convert('HSV') h, s, v = hsv_img.split() # 调整色相:将原图像的色相向蓝色目标值加权混合 def shift_hue(pixel): # PIL的HSV中,色相H的取值范围是0-255(对应0-360度) target_h = int(self.hue_target * 255) # 保留30%原色相,叠加70%蓝色色相,避免完全丢失原图像特征 return int(0.3 * pixel + 0.7 * target_h) adjusted_h = h.point(shift_hue) # 增强饱和度,同时限制最大值为255 adjusted_s = s.point(lambda x: min(int(x * self.saturation_boost), 255)) # 保持明度不变,可按需调整 adjusted_v = v.point(lambda x: min(int(x * self.value_keep), 255)) # 合并通道并转回RGB模式 adjusted_hsv = Image.merge('HSV', (adjusted_h, adjusted_s, adjusted_v)) return adjusted_hsv.convert('RGB')
使用时同样将BlueTintTransform加入transforms.Compose即可,参数可根据实际效果微调。
为什么之前的方法会出问题
torchvision.transforms.functional里的adjust_hue是对色相环进行整体旋转,比如把红色转成蓝色的同时,原有的蓝色会被转成黄色,导致画面出现绿紫、红蓝混合的怪异色调。这种方法适合整体色相偏移,但不适合让全图统一偏蓝。而上面两种方案要么直接增强蓝色通道,要么定向将色相拉到蓝色范围,不会出现颜色混乱的问题。
内容的提问来源于stack exchange,提问作者Codeman
相关产品推荐
相关产品推荐

