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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 00:35:25