95 lines
4.4 KiB
Markdown
95 lines
4.4 KiB
Markdown
# Documentation
|
|
- Class name: CreateVoronoiMask
|
|
- Category: KJNodes/masking/generate
|
|
- Output node: False
|
|
- Repo Ref: https://github.com/kijai/ComfyUI-KJNodes.git
|
|
|
|
方法 'createvoronoi' 旨在生成一个Voronoi遮罩,这是一种几何图案,可用于各种图像处理任务。它利用Voronoi图的随机性来创建独特和复杂的图案,这些图案可以根据点的数量、线宽以及起始点和结束点之间的转换速度进行调整。
|
|
|
|
# Input types
|
|
## Required
|
|
- frames
|
|
- 参数 'frames' 确定在Voronoi遮罩序列中生成的帧数。它对于定义输出动画或图案的长度至关重要。
|
|
- Comfy dtype: INT
|
|
- Python dtype: int
|
|
- num_points
|
|
- 参数 'num_points' 指定用于创建Voronoi图的点的数量。它直接影响生成的遮罩的复杂性和细节。
|
|
- Comfy dtype: INT
|
|
- Python dtype: int
|
|
- line_width
|
|
- 参数 'line_width' 控制Voronoi遮罩中线的粗细。它是确定图案特征可见性和突出度的重要因素。
|
|
- Comfy dtype: INT
|
|
- Python dtype: int
|
|
- speed
|
|
- 参数 'speed' 决定点从起始位置过渡到结束位置的速率。它影响遮罩序列中的动态运动。
|
|
- Comfy dtype: FLOAT
|
|
- Python dtype: float
|
|
- frame_width
|
|
- 参数 'frame_width' 设置遮罩序列中每个帧的宽度。它对于定义输出的纵横比和整体尺寸至关重要。
|
|
- Comfy dtype: INT
|
|
- Python dtype: int
|
|
- frame_height
|
|
- 参数 'frame_height' 确定遮罩序列中每个帧的高度。它与 'frame_width' 一起工作,以确定输出的整体形状。
|
|
- Comfy dtype: INT
|
|
- Python dtype: int
|
|
|
|
# Output types
|
|
- mask
|
|
- 输出参数 'mask' 表示生成的Voronoi遮罩作为张量。这是一个二进制图像,其中遮罩的图案已编码,准备进行进一步处理或应用。
|
|
- Comfy dtype: TORCH.TENSOR
|
|
- Python dtype: torch.Tensor
|
|
- mask_inverted
|
|
- 输出参数 'mask_inverted' 提供了生成的Voronoi遮罩的反转版本。这对于在图像处理中创建补充图案或效果非常有用。
|
|
- Comfy dtype: TORCH.TENSOR
|
|
- Python dtype: torch.Tensor
|
|
|
|
# Usage tips
|
|
- Infra type: CPU
|
|
|
|
# Source code
|
|
```
|
|
class CreateVoronoiMask:
|
|
RETURN_TYPES = ('MASK', 'MASK')
|
|
RETURN_NAMES = ('mask', 'mask_inverted')
|
|
FUNCTION = 'createvoronoi'
|
|
CATEGORY = 'KJNodes/masking/generate'
|
|
|
|
@classmethod
|
|
def INPUT_TYPES(s):
|
|
return {'required': {'frames': ('INT', {'default': 16, 'min': 2, 'max': 4096, 'step': 1}), 'num_points': ('INT', {'default': 15, 'min': 1, 'max': 4096, 'step': 1}), 'line_width': ('INT', {'default': 4, 'min': 1, 'max': 4096, 'step': 1}), 'speed': ('FLOAT', {'default': 0.5, 'min': 0.0, 'max': 1.0, 'step': 0.01}), 'frame_width': ('INT', {'default': 512, 'min': 16, 'max': 4096, 'step': 1}), 'frame_height': ('INT', {'default': 512, 'min': 16, 'max': 4096, 'step': 1})}}
|
|
|
|
def createvoronoi(self, frames, num_points, line_width, speed, frame_width, frame_height):
|
|
from scipy.spatial import Voronoi
|
|
batch_size = frames
|
|
out = []
|
|
aspect_ratio = frame_width / frame_height
|
|
start_points = np.random.rand(num_points, 2)
|
|
start_points[:, 0] *= aspect_ratio
|
|
end_points = np.random.rand(num_points, 2)
|
|
end_points[:, 0] *= aspect_ratio
|
|
for i in range(batch_size):
|
|
t = i * speed / (batch_size - 1)
|
|
t = np.clip(t, 0, 1)
|
|
points = (1 - t) * start_points + t * end_points
|
|
points[:, 0] *= aspect_ratio
|
|
vor = Voronoi(points)
|
|
(fig, ax) = plt.subplots()
|
|
plt.subplots_adjust(left=0, right=1, bottom=0, top=1)
|
|
ax.set_xlim([0, aspect_ratio])
|
|
ax.set_ylim([0, 1])
|
|
ax.axis('off')
|
|
ax.margins(0, 0)
|
|
fig.set_size_inches(aspect_ratio * frame_height / 100, frame_height / 100)
|
|
ax.fill_between([0, 1], [0, 1], color='white')
|
|
for simplex in vor.ridge_vertices:
|
|
simplex = np.asarray(simplex)
|
|
if np.all(simplex >= 0):
|
|
plt.plot(vor.vertices[simplex, 0], vor.vertices[simplex, 1], 'k-', linewidth=line_width)
|
|
fig.canvas.draw()
|
|
img = np.array(fig.canvas.renderer._renderer)
|
|
plt.close(fig)
|
|
pil_img = Image.fromarray(img).convert('L')
|
|
mask = torch.tensor(np.array(pil_img)) / 255.0
|
|
out.append(mask)
|
|
return (torch.stack(out, dim=0), 1.0 - torch.stack(out, dim=0))
|
|
``` |