4.4 KiB
4.4 KiB
Documentation
- Class name: SaltCropImageLocation
- Category: SALT/Image/Process
- Output node: False
本节点旨在根据指定位置裁剪图像,实现对图像数据集的精确调整和修改。它专注于增强或隔离图像中的特定区域,以便进行进一步处理或分析。
Input types
Required
- images
- 要裁剪的图像集合。该参数是节点操作的核心,它决定了将根据提供的尺寸进行裁剪的具体图像。
- Comfy dtype: IMAGE
- Python dtype: List[Image]
- top
- 指定裁剪区域的上边界。调整此值可以改变裁剪的垂直起点,从而对裁剪区域进行精细控制。
- Comfy dtype: INT
- Python dtype: int
- left
- 定义裁剪区域的左边界。该参数允许精确控制裁剪的水平位置,影响保留的图像区域。
- Comfy dtype: INT
- Python dtype: int
- right
- 设置裁剪区域的右边界,决定裁剪区域的水平范围。这个值影响最终裁剪图像的宽度。
- Comfy dtype: INT
- Python dtype: int
- bottom
- 指示裁剪区域的下边界。该参数影响裁剪的垂直范围,控制裁剪图像的高度。
- Comfy dtype: INT
- Python dtype: int
Optional
- crop_data_batch
- 可选的裁剪数据批次,用于为一组图像指定多个裁剪区域。该参数支持对具有不同裁剪规格的图像进行批处理。
- Comfy dtype: CROP_DATA_BATCH
- Python dtype: Optional[List[Tuple[int, int, int, int]]]
Output types
- images
- 裁剪操作后的结果图像。这个输出对于裁剪区域的进一步处理或分析至关重要。
- Comfy dtype: IMAGE
- Python dtype: List[Image]
- crop_data_batch
- 对应于处理后图像的裁剪数据批次。这个输出提供了应用于每张图像的裁剪区域的详细信息,便于进行进一步的操作或分析。
- Comfy dtype: CROP_DATA_BATCH
- Python dtype: List[Tuple[int, int, int, int]]
Usage tips
- Infra type:
CPU - Common nodes: unknown
Source code
class SaltCropImageLocation:
@classmethod
def INPUT_TYPES(cls):
return {
"required": {
"images": ("IMAGE",),
"top": ("INT", {"default":0, "max": 10000000, "min":0, "step":1}),
"left": ("INT", {"default":0, "max": 10000000, "min":0, "step":1}),
"right": ("INT", {"default":256, "max": 10000000, "min":0, "step":1}),
"bottom": ("INT", {"default":256, "max": 10000000, "min":0, "step":1}),
},
"optional": {
"crop_data_batch": ("CROP_DATA_BATCH",)
}
}
RETURN_TYPES = ("IMAGE", "CROP_DATA_BATCH")
RETURN_NAMES = ("images", "crop_data_batch")
FUNCTION = "crop"
CATEGORY = f"{NAME}/Image/Process"
def crop(self, images, top=0, left=0, right=256, bottom=256, crop_data_batch=None):
cropped_images = []
crop_data_list = []
master_size = None
for i, image in enumerate(images):
image = tensor2pil(image)
img_width, img_height = image.size
if crop_data_batch is not None:
if len(crop_data_batch) >= i:
crop_size, (crop_left, crop_top, crop_right, crop_bottom) = crop_data_batch[i]
else:
cropped_images.append(pil2tensor(image))
crop_data_list.append((image.size, (0, 0, image.size[0], image.size[1])))
continue
else:
crop_top = max(top, 0)
crop_left = max(left, 0)
crop_bottom = min(bottom, img_height)
crop_right = min(right, img_width)
crop_width = crop_right - crop_left
crop_height = crop_bottom - crop_top
if crop_width <= 0 or crop_height <= 0:
raise ValueError("Invalid crop dimensions.")
crop = image.crop((crop_left, crop_top, crop_right, crop_bottom))
crop_data = (crop.size, (crop_left, crop_top, crop_right, crop_bottom))
if not master_size:
master_size = (((crop.size[0] // 8) * 8), ((crop.size[1] // 8) * 8))
crop = crop.resize(master_size)
cropped_images.append(pil2tensor(crop))
crop_data_list.append(crop_data)
cropped_images_batch = torch.cat(cropped_images, dim=0)
return (cropped_images_batch, crop_data_list)