Files
CavinHuang-comfyui-nodes-docs/docs/SaltScheduledImageAdjust.md
2024-07-04 08:39:03 +08:00

5.4 KiB

Documentation

SaltScheduledImageAdjust节点专门用于对一批图像应用计划调整,允许随时间动态改变亮度、对比度、饱和度、锐度、高斯模糊和边缘增强。它能够创建图像属性按预定计划演变的序列,从而增强视觉叙事或数据可视化效果。

Input types

Required

  • images
    • 要调整的图像集合。这个参数是节点操作的核心,它定义了将要进行计划转换的图像集。
    • Comfy dtype: IMAGE
    • Python dtype: List[Image]

Optional

  • masks
    • 可选的蒙版,用于在图像上选择性地应用调整。这允许更精确地控制图像的哪些区域受到调整的影响。
    • Comfy dtype: MASK
    • Python dtype: List[Image]
  • brightness_schedule
    • 定义图像亮度如何随时间变化的计划。这通过按预定序列改变图像的亮度来实现动态视觉效果。
    • Comfy dtype: LIST
    • Python dtype: List[float]
  • contrast_schedule
    • 规定随时间变化的对比度调整计划,允许增强或减少图像最暗和最亮部分之间的差异。
    • Comfy dtype: LIST
    • Python dtype: List[float]
  • saturation_schedule
    • 定义图像颜色强度如何随时间变化,使得能够创建鲜艳或柔和的颜色序列。
    • Comfy dtype: LIST
    • Python dtype: List[float]
  • sharpness_schedule
    • 调整图像细节清晰度或模糊度随时间变化的计划,有助于聚焦特定元素或创建梦幻般的序列。
    • Comfy dtype: LIST
    • Python dtype: List[float]
  • gaussian_blur_schedule
    • 确定随时间应用于图像的高斯模糊程度,允许创建柔焦效果或过渡。
    • Comfy dtype: LIST
    • Python dtype: List[float]
  • edge_enhance_schedule
    • 随时间增强图像内边缘的计划,可用于突出细节或创造更具图形感的外观。
    • Comfy dtype: LIST
    • Python dtype: List[float]

Output types

  • image
    • 应用计划调整后的图像,展示随时间的动态变化。
    • Comfy dtype: IMAGE
    • Python dtype: List[Image]

Usage tips

  • Infra type: CPU
  • Common nodes: unknown

Source code

class SaltScheduledImageAdjust:
    @classmethod
    def INPUT_TYPES(cls):
        return {
            "required": {
                "images": ("IMAGE",),
            },
            "optional": {
                "masks": ("MASK",),
                "brightness_schedule": ("LIST", ),
                "contrast_schedule": ("LIST", ),
                "saturation_schedule": ("LIST", ),
                "sharpness_schedule": ("LIST", ),
                "gaussian_blur_schedule": ("LIST", ),
                "edge_enhance_schedule": ("LIST", ),
            }
        }

    RETURN_TYPES = ("IMAGE",)
    FUNCTION = "images_adjust"

    CATEGORY = "SALT/Scheduling/Image"

    def float_value(self, adj_list, idx):
        if isinstance(adj_list, list) and adj_list:
            return adj_list[idx] if idx < len(adj_list) else adj_list[-1]
        else:
            return 1.0

    def images_adjust(
            self, 
            images, 
            masks=[], 
            brightness_schedule=[1.0], 
            contrast_schedule=[1.0], 
            saturation_schedule=[1.0], 
            sharpness_schedule=[1.0], 
            gaussian_blur_schedule=[0.0], 
            edge_enhance_schedule=[0.0]
        ):
        
        adjusted_images = []
        for idx, img in enumerate(images):
            original_pil_image = tensor2pil(img.unsqueeze(0))
            pil_image = original_pil_image.copy() 
            if isinstance(masks, torch.Tensor):
                pil_mask = mask2pil(masks[idx].unsqueeze(0)) if idx < len(masks) else mask2pil(masks[-1].unsqueeze(0))
                pil_mask = pil_mask.resize(original_pil_image.size).convert('L')
            else:
                pil_mask = None

            brightness = self.float_value(brightness_schedule, idx)
            contrast = self.float_value(contrast_schedule, idx)
            saturation = self.float_value(saturation_schedule, idx)
            sharpness = self.float_value(sharpness_schedule, idx)
            gaussian_blur = self.float_value(gaussian_blur_schedule, idx)
            edge_enhance = self.float_value(edge_enhance_schedule, idx)

            if brightness != 1.0:
                pil_image = ImageEnhance.Brightness(pil_image).enhance(brightness)
            
            if contrast != 1.0:
                pil_image = ImageEnhance.Contrast(pil_image).enhance(contrast)

            if saturation != 1.0:
                pil_image = ImageEnhance.Color(pil_image).enhance(saturation)

            if sharpness != 1.0:
                pil_image = ImageEnhance.Sharpness(pil_image).enhance(sharpness)

            if gaussian_blur > 0.0:
                pil_image = pil_image.filter(ImageFilter.GaussianBlur(radius=gaussian_blur))

            if edge_enhance > 0.0:
                edge_enhanced_img = pil_image.filter(ImageFilter.EDGE_ENHANCE_MORE)
                blend_mask = Image.new("L", pil_image.size, color=int(round(edge_enhance * 255)))
                pil_image = Image.composite(edge_enhanced_img, pil_image, blend_mask)

            if pil_mask:
                pil_image = Image.composite(pil_image, original_pil_image, pil_mask)

            adjusted_images.append(pil2tensor(pil_image))

        return (torch.cat(adjusted_images, dim=0), )