94 lines
3.6 KiB
Markdown
94 lines
3.6 KiB
Markdown
|
|
# Documentation
|
|
- Class name: SaltScheduledBinaryComparison
|
|
- Category: SALT/Scheduling/Image
|
|
- Output node: False
|
|
- Repo Ref: Unknown/Unavailable
|
|
|
|
SaltScheduledBinaryComparison节点对一批图像执行定时二元比较,应用可选考虑误差范围(epsilon)的阈值操作。它根据提供的调度动态调整批次中每个图像的比较阈值,实现灵活的图像处理操作,可以随时间或跨不同图像而变化。
|
|
|
|
# Input types
|
|
## Required
|
|
- images
|
|
- 要处理的图像批次。此参数对于定义将应用二元阈值操作的图像集至关重要,直接影响节点的执行和结果。
|
|
- Comfy dtype: IMAGE
|
|
- Python dtype: torch.Tensor
|
|
- comparison_schedule
|
|
- 用作二元比较阈值的比较值调度表,适用于整个图像批次。这个调度表直接影响阈值操作,实现每个图像的动态调整。
|
|
- Comfy dtype: LIST
|
|
- Python dtype: List[float]
|
|
|
|
## Optional
|
|
- epsilon_schedule
|
|
- 可选的epsilon值调度表,用于在比较中允许误差范围,使接近阈值的值也被视为匹配。此参数通过适应微小变化,为阈值操作增加了灵活性。
|
|
- Comfy dtype: LIST
|
|
- Python dtype: List[float]
|
|
- use_epsilon
|
|
- 决定是否在比较中使用epsilon误差范围的标志。这影响是否将接近阈值的值视为匹配,为二元比较增加了一层灵活性。
|
|
- Comfy dtype: BOOLEAN
|
|
- Python dtype: bool
|
|
|
|
# Output types
|
|
- images
|
|
- 二元阈值操作的结果,其中图像批次中的每个像素根据比较结果被设置为1或0。
|
|
- Comfy dtype: IMAGE
|
|
- Python dtype: torch.Tensor
|
|
|
|
|
|
## Usage tips
|
|
- Infra type: `GPU`
|
|
- Common nodes: unknown
|
|
|
|
|
|
## Source code
|
|
```python
|
|
class SaltScheduledBinaryComparison:
|
|
@classmethod
|
|
def INPUT_TYPES(cls):
|
|
return {
|
|
"required": {
|
|
"images": ("IMAGE",),
|
|
"comparison_schedule": ("LIST",),
|
|
},
|
|
"optional": {
|
|
"epsilon_schedule": ("LIST", {}),
|
|
"use_epsilon": ("BOOLEAN", {"default": True})
|
|
}
|
|
}
|
|
|
|
RETURN_TYPES = ("IMAGE",)
|
|
RETURN_NAMES = ("images",)
|
|
|
|
FUNCTION = "binary_threshold"
|
|
CATEGORY = "SALT/Scheduling/Image"
|
|
|
|
def binary_threshold(self, images, comparison_schedule, epsilon_schedule=[0.1], use_epsilon=True):
|
|
batch_size = images.shape[0]
|
|
|
|
if len(comparison_schedule) < batch_size:
|
|
last_val = comparison_schedule[-1]
|
|
comparison_schedule.extend([last_val] * (batch_size - len(comparison_schedule)))
|
|
comparison_schedule = comparison_schedule[:batch_size]
|
|
|
|
thresholds_tensor = torch.tensor(comparison_schedule, dtype=images.dtype).view(batch_size, 1, 1, 1)
|
|
|
|
if use_epsilon:
|
|
if epsilon_schedule is None:
|
|
epsilon_schedule = [0.1] * batch_size
|
|
if len(epsilon_schedule) < batch_size:
|
|
last_eps = epsilon_schedule[-1]
|
|
epsilon_schedule.extend([last_eps] * (batch_size - len(epsilon_schedule)))
|
|
epsilon_schedule = epsilon_schedule[:batch_size]
|
|
epsilon_tensor = torch.tensor(epsilon_schedule, dtype=images.dtype).view(batch_size, 1, 1, 1)
|
|
|
|
condition_met = ((images == thresholds_tensor) |
|
|
(torch.abs(images - thresholds_tensor) <= epsilon_tensor))
|
|
else:
|
|
condition_met = images >= thresholds_tensor
|
|
|
|
thresholded_images = torch.where(condition_met, torch.tensor(1.0, dtype=images.dtype), torch.tensor(0.0, dtype=images.dtype))
|
|
|
|
return (thresholded_images, )
|
|
|
|
```
|