Files
CavinHuang-comfyui-nodes-docs/docs/Image fDOF Filter.md
2024-05-26 20:35:16 +08:00

3.9 KiB

Documentation

WAS_Image_fDOF节点的fdof_composite函数旨在对图像应用景深效果,通过模糊背景来增强对主体的视觉焦点。它通过结合不同的图像处理技术实现这一效果,这些技术适用于不同的模式,如模拟、高斯或盒状模糊,并通过诸如半径和样本数等参数进行定制。

Input types

Required

  • image
    • 图像参数对于节点的操作至关重要,因为它是将要应用景深效果的输入图像。它通过确定将要处理的视觉内容,显著影响节点执行的最终结果。
    • Comfy dtype: IMAGE
    • Python dtype: torch.Tensor
  • depth
    • 深度参数提供了一个深度图,用于确定图像中应该聚焦或模糊的区域。它在节点的执行中起着关键作用,通过指导景深效果的应用。
    • Comfy dtype: IMAGE
    • Python dtype: torch.Tensor

Optional

  • mode
    • 模式参数确定要应用于图像的模糊类型。它很重要,因为它决定了景深效果的风格,提供了模拟、高斯或盒状模糊等选项。
    • Comfy dtype: COMBO['mock', 'gaussian', 'box']
    • Python dtype: str
  • radius
    • 半径参数定义了模糊效果的范围,对于控制景深的强度很重要。它直接影响输出图像中模糊区域的外观。
    • Comfy dtype: INT
    • Python dtype: int
  • samples
    • 样本参数指定了模糊效果应用的次数,这可以增加模糊的平滑度。它通过确定最终合成图像中的细节水平来影响节点的执行。
    • Comfy dtype: INT
    • Python dtype: int

Output types

  • output_image
    • 输出图像参数代表了应用了景深效果的最终处理图像。它很重要,因为它是节点操作的直接结果,并反映了应用的过滤器的创意意图。
    • Comfy dtype: IMAGE
    • Python dtype: torch.Tensor

Usage tips

  • Infra type: CPU

Source code

class WAS_Image_fDOF:

    def __init__(self):
        pass

    @classmethod
    def INPUT_TYPES(cls):
        return {'required': {'image': ('IMAGE',), 'depth': ('IMAGE',), 'mode': (['mock', 'gaussian', 'box'],), 'radius': ('INT', {'default': 8, 'min': 1, 'max': 128, 'step': 1}), 'samples': ('INT', {'default': 1, 'min': 1, 'max': 3, 'step': 1})}}
    RETURN_TYPES = ('IMAGE',)
    FUNCTION = 'fdof_composite'
    CATEGORY = 'WAS Suite/Image/Filter'

    def fdof_composite(self, image, depth, radius, samples, mode):
        import cv2 as cv
        tensor_images = []
        for i in range(len(image)):
            if i <= len(image):
                img = tensor2pil(image[i])
            else:
                img = tensor2pil(image[-1])
            if i <= len(depth):
                dpth = tensor2pil(depth[i])
            else:
                dpth = tensor2pil(depth[-1])
            tensor_images.append(pil2tensor(self.portraitBlur(img, dpth, radius, samples, mode)))
        tensor_images = torch.cat(tensor_images, dim=0)
        return (tensor_images,)

    def portraitBlur(self, img, mask, radius, samples, mode='mock'):
        mask = mask.resize(img.size).convert('L')
        bimg: Optional[Image.Image] = None
        if mode == 'mock':
            bimg = medianFilter(img, radius, radius * 1500, 75)
        elif mode == 'gaussian':
            bimg = img.filter(ImageFilter.GaussianBlur(radius=radius))
        elif mode == 'box':
            bimg = img.filter(ImageFilter.BoxBlur(radius))
        else:
            return
        bimg.convert(img.mode)
        rimg: Optional[Image.Image] = None
        if samples > 1:
            for i in range(samples):
                if not rimg:
                    rimg = Image.composite(img, bimg, mask)
                else:
                    rimg = Image.composite(rimg, bimg, mask)
        else:
            rimg = Image.composite(img, bimg, mask).convert('RGB')
        return rimg