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

4.8 KiB

Documentation

AlphaMatte节点是一个专门用于图像处理的高级工具,主要功能是提取和优化图像的alpha遮罩(透明度通道)。它利用深度学习技术,通过分析图像及其alpha trimap(三值图),能够准确地将前景与背景分离,即使在复杂场景中也能表现出色。该节点具备预模糊处理、调整黑白点以及进行迭代优化的能力,以实现高质量的遮罩提取。

Input types

Required

  • images
    • 需要提取alpha遮罩的输入图像。这个参数至关重要,因为它直接影响遮罩提取过程的质量和准确性。
    • Comfy dtype: IMAGE
    • Python dtype: torch.Tensor
  • alpha_trimap
    • 一个三值图,为前景、背景和未知区域提供初步猜测,指导遮罩提取过程。
    • Comfy dtype: IMAGE
    • Python dtype: torch.Tensor
  • preblur
    • 指定应用于trimap的预模糊量,用于平滑硬边缘并改善遮罩提取效果。
    • Comfy dtype: INT
    • Python dtype: int
  • blackpoint
    • 用于调整trimap对比度的黑点值,有助于更清晰地分离前景和背景。
    • Comfy dtype: FLOAT
    • Python dtype: float
  • whitepoint
    • 用于调整trimap亮度的白点值,增强前景和背景区域之间的区分度。
    • Comfy dtype: FLOAT
    • Python dtype: float
  • max_iterations
    • 允许优化alpha遮罩的最大迭代次数,确保质量和计算效率之间的平衡。
    • Comfy dtype: INT
    • Python dtype: int
  • estimate_fg
    • 一个标志,指示是否除alpha遮罩外还要估算前景,提供更完整的图像元素分离。
    • Comfy dtype: COMBO[STRING]
    • Python dtype: str

Output types

  • alpha
    • 提取出的alpha遮罩,表示图像中前景元素的透明度级别。
    • Comfy dtype: IMAGE
    • Python dtype: torch.Tensor
  • fg
    • 当estimate_fg标志为真时获得的估算图像前景。
    • Comfy dtype: IMAGE
    • Python dtype: torch.Tensor
  • bg
    • 估算的图像背景,适用于合成或进一步处理。
    • Comfy dtype: IMAGE
    • Python dtype: torch.Tensor

Usage tips

  • Infra type: GPU
  • Common nodes: unknown

Source code

class AlphaMatte:
    def __init__(self):
        pass

    @classmethod
    def INPUT_TYPES(s):
        return {
            "required": {
                "images": ("IMAGE",),
                "alpha_trimap": ("IMAGE",),
                "preblur": ("INT", {
                    "default": 8,
                    "min": 0,
                    "max": 256,
                    "step": 1
                }),
                "blackpoint": ("FLOAT", {
                    "default": 0.01,
                    "min": 0.0,
                    "max": 0.99,
                    "step": 0.01
                }),
                "whitepoint": ("FLOAT", {
                    "default": 0.99,
                    "min": 0.01,
                    "max": 1.0,
                    "step": 0.01
                }),
                "max_iterations": ("INT", {
                    "default": 1000,
                    "min": 100,
                    "max": 10000,
                    "step": 100
                }),
                "estimate_fg": (["true", "false"],),
            },
        }

    RETURN_TYPES = ("IMAGE", "IMAGE", "IMAGE",)
    RETURN_NAMES = ("alpha", "fg", "bg",)
    FUNCTION = "alpha_matte"

    CATEGORY = "image/filters"

    def alpha_matte(self, images, alpha_trimap, preblur, blackpoint, whitepoint, max_iterations, estimate_fg):
        
        d = preblur * 2 + 1
        
        i_dup = copy.deepcopy(images.cpu().numpy().astype(np.float64))
        a_dup = copy.deepcopy(alpha_trimap.cpu().numpy().astype(np.float64))
        fg = copy.deepcopy(images.cpu().numpy().astype(np.float64))
        bg = copy.deepcopy(images.cpu().numpy().astype(np.float64))
        
        
        for index, image in enumerate(i_dup):
            trimap = a_dup[index][:,:,0] # convert to single channel
            if preblur > 0:
                trimap = cv2.GaussianBlur(trimap, (d, d), 0)
            trimap = fix_trimap(trimap, blackpoint, whitepoint)
            
            alpha = estimate_alpha_cf(image, trimap, laplacian_kwargs={"epsilon": 1e-6}, cg_kwargs={"maxiter":max_iterations})
            
            if estimate_fg == "true":
                fg[index], bg[index] = estimate_foreground_ml(image, alpha, return_background=True)
            
            a_dup[index] = np.stack([alpha, alpha, alpha], axis = -1) # convert back to rgb
        
        return (
            torch.from_numpy(a_dup.astype(np.float32)), # alpha
            torch.from_numpy(fg.astype(np.float32)), # fg
            torch.from_numpy(bg.astype(np.float32)), # bg
            )