Image Filter Adjustments¶
Documentation¶
- Class name:
Image Filter Adjustments
- Category:
WAS Suite/Image/Filter
- Output node:
False
This node provides a comprehensive suite of image adjustment tools, allowing users to modify and enhance images through a variety of filters such as brightness, contrast, saturation, sharpness, and blur adjustments. It serves as a versatile tool for fine-tuning the visual aspects of images to meet specific aesthetic or technical requirements.
Input types¶
Required¶
image
- The input image to be adjusted. This parameter is crucial as it serves as the base for all subsequent adjustments, determining the visual output of the node.
- Comfy dtype:
IMAGE
- Python dtype:
torch.Tensor
brightness
- Adjusts the brightness level of the input image, affecting its overall lightness or darkness.
- Comfy dtype:
FLOAT
- Python dtype:
float
contrast
- Modifies the contrast of the input image, enhancing or reducing the difference between its light and dark areas.
- Comfy dtype:
FLOAT
- Python dtype:
float
saturation
- Alters the saturation level of the input image, adjusting the intensity of its colors.
- Comfy dtype:
FLOAT
- Python dtype:
float
sharpness
- Adjusts the sharpness of the input image, affecting the clarity and detail of its visual elements.
- Comfy dtype:
FLOAT
- Python dtype:
float
blur
- Applies a blur effect to the input image, softening its appearance by reducing detail and texture.
- Comfy dtype:
INT
- Python dtype:
int
gaussian_blur
- Applies a Gaussian blur effect to the input image, creating a smooth, blurred appearance with a specific radius.
- Comfy dtype:
FLOAT
- Python dtype:
int
edge_enhance
- Enhances the edges within the input image, making them more pronounced and defined.
- Comfy dtype:
FLOAT
- Python dtype:
bool
detail_enhance
- Enhances the details of the input image, improving its overall sharpness and clarity.
- Comfy dtype:
COMBO[STRING]
- Python dtype:
bool
Output types¶
image
- Comfy dtype:
IMAGE
- The adjusted image, reflecting the applied filters and enhancements.
- Python dtype:
torch.Tensor
- Comfy dtype:
Usage tips¶
- Infra type:
GPU
- Common nodes:
Source code¶
class WAS_Image_Filters:
def __init__(self):
pass
@classmethod
def INPUT_TYPES(cls):
return {
"required": {
"image": ("IMAGE",),
"brightness": ("FLOAT", {"default": 0.0, "min": -1.0, "max": 1.0, "step": 0.01}),
"contrast": ("FLOAT", {"default": 1.0, "min": -1.0, "max": 2.0, "step": 0.01}),
"saturation": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 5.0, "step": 0.01}),
"sharpness": ("FLOAT", {"default": 1.0, "min": -5.0, "max": 5.0, "step": 0.01}),
"blur": ("INT", {"default": 0, "min": 0, "max": 16, "step": 1}),
"gaussian_blur": ("FLOAT", {"default": 0.0, "min": 0.0, "max": 1024.0, "step": 0.1}),
"edge_enhance": ("FLOAT", {"default": 0.0, "min": 0.0, "max": 1.0, "step": 0.01}),
"detail_enhance": (["false", "true"],),
},
}
RETURN_TYPES = ("IMAGE",)
FUNCTION = "image_filters"
CATEGORY = "WAS Suite/Image/Filter"
def image_filters(self, image, brightness, contrast, saturation, sharpness, blur, gaussian_blur, edge_enhance, detail_enhance):
tensors = []
if len(image) > 1:
for img in image:
pil_image = None
# Apply NP Adjustments
if brightness > 0.0 or brightness < 0.0:
# Apply brightness
img = np.clip(img + brightness, 0.0, 1.0)
if contrast > 1.0 or contrast < 1.0:
# Apply contrast
img = np.clip(img * contrast, 0.0, 1.0)
# Apply PIL Adjustments
if saturation > 1.0 or saturation < 1.0:
# PIL Image
pil_image = tensor2pil(img)
# Apply saturation
pil_image = ImageEnhance.Color(pil_image).enhance(saturation)
if sharpness > 1.0 or sharpness < 1.0:
# Assign or create PIL Image
pil_image = pil_image if pil_image else tensor2pil(img)
# Apply sharpness
pil_image = ImageEnhance.Sharpness(pil_image).enhance(sharpness)
if blur > 0:
# Assign or create PIL Image
pil_image = pil_image if pil_image else tensor2pil(img)
# Apply blur
for _ in range(blur):
pil_image = pil_image.filter(ImageFilter.BLUR)
if gaussian_blur > 0.0:
# Assign or create PIL Image
pil_image = pil_image if pil_image else tensor2pil(img)
# Apply Gaussian blur
pil_image = pil_image.filter(
ImageFilter.GaussianBlur(radius=gaussian_blur))
if edge_enhance > 0.0:
# Assign or create PIL Image
pil_image = pil_image if pil_image else tensor2pil(img)
# Edge Enhancement
edge_enhanced_img = pil_image.filter(ImageFilter.EDGE_ENHANCE_MORE)
# Blend Mask
blend_mask = Image.new(
mode="L", size=pil_image.size, color=(round(edge_enhance * 255)))
# Composite Original and Enhanced Version
pil_image = Image.composite(
edge_enhanced_img, pil_image, blend_mask)
# Clean-up
del blend_mask, edge_enhanced_img
if detail_enhance == "true":
pil_image = pil_image if pil_image else tensor2pil(img)
pil_image = pil_image.filter(ImageFilter.DETAIL)
# Output image
out_image = (pil2tensor(pil_image) if pil_image else img)
tensors.append(out_image)
tensors = torch.cat(tensors, dim=0)
else:
pil_image = None
img = image
# Apply NP Adjustments
if brightness > 0.0 or brightness < 0.0:
# Apply brightness
img = np.clip(img + brightness, 0.0, 1.0)
if contrast > 1.0 or contrast < 1.0:
# Apply contrast
img = np.clip(img * contrast, 0.0, 1.0)
# Apply PIL Adjustments
if saturation > 1.0 or saturation < 1.0:
# PIL Image
pil_image = tensor2pil(img)
# Apply saturation
pil_image = ImageEnhance.Color(pil_image).enhance(saturation)
if sharpness > 1.0 or sharpness < 1.0:
# Assign or create PIL Image
pil_image = pil_image if pil_image else tensor2pil(img)
# Apply sharpness
pil_image = ImageEnhance.Sharpness(pil_image).enhance(sharpness)
if blur > 0:
# Assign or create PIL Image
pil_image = pil_image if pil_image else tensor2pil(img)
# Apply blur
for _ in range(blur):
pil_image = pil_image.filter(ImageFilter.BLUR)
if gaussian_blur > 0.0:
# Assign or create PIL Image
pil_image = pil_image if pil_image else tensor2pil(img)
# Apply Gaussian blur
pil_image = pil_image.filter(
ImageFilter.GaussianBlur(radius=gaussian_blur))
if edge_enhance > 0.0:
# Assign or create PIL Image
pil_image = pil_image if pil_image else tensor2pil(img)
# Edge Enhancement
edge_enhanced_img = pil_image.filter(ImageFilter.EDGE_ENHANCE_MORE)
# Blend Mask
blend_mask = Image.new(
mode="L", size=pil_image.size, color=(round(edge_enhance * 255)))
# Composite Original and Enhanced Version
pil_image = Image.composite(
edge_enhanced_img, pil_image, blend_mask)
# Clean-up
del blend_mask, edge_enhanced_img
if detail_enhance == "true":
pil_image = pil_image if pil_image else tensor2pil(img)
pil_image = pil_image.filter(ImageFilter.DETAIL)
# Output image
out_image = (pil2tensor(pil_image) if pil_image else img)
tensors = out_image
return (tensors, )