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

3.4 KiB

Documentation

SaltScheduledImageDisplacement节点用于根据提供的振幅和角度调度表,对一批图像应用预定的位移效果。该节点利用优化的位移层进行图像变换,允许在序列中动态操作图像,根据预定义的调度表调整位移效果。这种方法实现了对图像的精细控制,能够创造出随时间或序列变化的动态视觉效果。

Input types

Required

  • images
    • 需要进行位移处理的图像批次。这是定义将要经历位移变换的基础内容的关键输入。
    • Comfy dtype: IMAGE
    • Python dtype: torch.Tensor
  • displacement_images
    • 用于确定批次中每张图像的位移方向和幅度的图像。这些图像在指导位移过程中起着关键作用。
    • Comfy dtype: IMAGE
    • Python dtype: torch.Tensor

Optional

  • amplitude_schedule
    • 指定批次中每张图像位移幅度的调度表。它控制位移效果的强度。
    • Comfy dtype: LIST
    • Python dtype: Optional[List[float]]
  • angle_schedule
    • 详细说明每张图像位移角度的调度表。这个参数决定了位移效果的方向。
    • Comfy dtype: LIST
    • Python dtype: Optional[List[float]]

Output types

  • images
    • 应用预定位移后的图像批次。这个输出展示了经过位移效果处理后的转换图像。
    • Comfy dtype: IMAGE
    • Python dtype: torch.Tensor

Usage tips

  • Infra type: GPU
  • Common nodes: unknown

Source code

class SaltScheduledImageDisplacement:
    @classmethod
    def INPUT_TYPES(cls):
        return {
            "required": {
                "images": ("IMAGE",),
                "displacement_images": ("IMAGE",),
            },
            "optional": {
                "amplitude_schedule": ("LIST",),
                "angle_schedule": ("LIST",),
            }
        }

    RETURN_TYPES = ("IMAGE",)
    RETURN_NAMES = ("images",)

    FUNCTION = "apply_displacement"
    CATEGORY = "SALT/Scheduling/Image"

    def apply_displacement(self, images, displacement_images, amplitude_schedule=None, angle_schedule=None):
        batch_size, height, width, _ = images.shape
        device = images.device

        # Initialize the optimized displacement layer
        displacement_layer = DisplacementLayer(device)

        displaced_images = []
        for i in range(batch_size):
            # Default amplitude and angle to 0 if their schedules are not provided or are too short
            amplitude_value = amplitude_schedule[i] if amplitude_schedule and i < len(amplitude_schedule) else 0
            angle_value = angle_schedule[i] if angle_schedule and i < len(angle_schedule) else 0

            amplitude = torch.tensor([amplitude_value], dtype=torch.float, device=device)
            angle = torch.tensor([angle_value], dtype=torch.float, device=device)
            
            image = images[i:i+1].to(device)
            displacement_image = displacement_images[i:i+1].to(device)
            
            # Use the displacement layer
            displaced_image = displacement_layer(image, displacement_image, amplitude, angle)
            displaced_images.append(displaced_image)

        # Combine the batch of displaced images
        displaced_images = torch.cat(displaced_images, dim=0)

        return (displaced_images,)