Adds HSV Threshold Mask

actually update examples as well
This commit is contained in:
EllangoK
2023-05-07 22:17:13 -04:00
parent 495abbae92
commit 76be38e595
8 changed files with 590 additions and 430 deletions
+3 -2
View File
@@ -21,14 +21,15 @@ Both images have the workflow attached, and are included with the repo. Feel fre
- ArithmeticBlend: Blends two images using arithmetic operations like addition, subtraction, and difference. - ArithmeticBlend: Blends two images using arithmetic operations like addition, subtraction, and difference.
- Blend: Blends two images together with a variety of different modes - Blend: Blends two images together with a variety of different modes
- Blur: Applies a Gaussian blur to the input image, softening the details - Blur: Applies a Gaussian blur to the input image, softening the details
- CannyEdgeDetection: Applies Canny edge detection to the input image - CannyEdgeMask: Creates a mask using canny edge detection
- Chromatic Aberration: Shifts the color channels in an image, creating a glitch aesthetic - Chromatic Aberration: Shifts the color channels in an image, creating a glitch aesthetic
- $\color{#00A7B5}\textbf{ColorCorrect:}$ Adjusts the color balance, temperature, hue, brightness, contrast, saturation, and gamma of an image - $\color{#00A7B5}\textbf{ColorCorrect:}$ Adjusts the color balance, temperature, hue, brightness, contrast, saturation, and gamma of an image
- $\color{#00A7B5}\textbf{ColorTint:}$ Applies a customizable tint to the input image, with various color modes such as sepia, RGB, CMY and several composite colors - $\color{#00A7B5}\textbf{ColorTint:}$ Applies a customizable tint to the input image, with various color modes such as sepia, RGB, CMY and several composite colors
- Dissolve: Creates a grainy blend of two images using random pixels based on a dissolve factor. - Dissolve: Creates a grainy blend of two images using random pixels based on a dissolve factor.
- DodgeAndBurn: Adjusts image brightness using dodge and burn effects based on a mask and intensity. - DodgeAndBurn: Adjusts image brightness using dodge and burn effects based on a mask and intensity.
- FilmGrain: Adds a film grain effect to the image, along with options to control the temperature, and vignetting - FilmGrain: Adds a film grain effect to the image, along with options to control the temperature, and vignetting.
- Glow: Applies a blur with a specified radius and then blends it with the original image. Creates a nice glowing effect. - Glow: Applies a blur with a specified radius and then blends it with the original image. Creates a nice glowing effect.
- HSVThresholdMask: Creates a mask by thresholding HSV (hue, saturation, and value) channels
- $\color{#00A7B5}\textbf{KuwaharaBlur:}$ Applies an edge preserving blur, creating a more realistic blur than Gaussian. - $\color{#00A7B5}\textbf{KuwaharaBlur:}$ Applies an edge preserving blur, creating a more realistic blur than Gaussian.
- Parabolize: Applies a color transformation effect using a parabolic formula - Parabolize: Applies a color transformation effect using a parabolic formula
- PencilSketch: Converts an image into a hand-drawn pencil sketch style. - PencilSketch: Converts an image into a hand-drawn pencil sketch style.
+2 -1
View File
@@ -3,12 +3,13 @@ from pathlib import Path
import argparse import argparse
ignore_dirs = ["old"] ignore_dirs = ["old"]
ignore_files = ["__init__.py", "combine_files.py", "test.py"]
def get_python_files(path, recursive=False, args=None): def get_python_files(path, recursive=False, args=None):
search_pattern = "**/*.py" if recursive else "*.py" search_pattern = "**/*.py" if recursive else "*.py"
def should_include(file): def should_include(file):
if file.is_file() and not file.name.startswith("combine") and not args.output in str(file) and not file.name.startswith("__init__"): if file.is_file() and not args.output in str(file) and not file.name in ignore_files:
for ignore_dir in ignore_dirs: for ignore_dir in ignore_dirs:
if ignore_dir in str(file.parent): if ignore_dir in str(file.parent):
return False return False
File diff suppressed because it is too large Load Diff
Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 MiB

After

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 436 KiB

After

Width:  |  Height:  |  Size: 370 KiB

@@ -3,7 +3,7 @@ import numpy as np
import torch import torch
class CannyEdgeDetection: class CannyEdgeMask:
def __init__(self): def __init__(self):
pass pass
@@ -46,5 +46,5 @@ class CannyEdgeDetection:
return (result,) return (result,)
NODE_CLASS_MAPPINGS = { NODE_CLASS_MAPPINGS = {
"CannyEdgeDetection": CannyEdgeDetection "CannyEdgeMask": CannyEdgeMask
} }
+61
View File
@@ -0,0 +1,61 @@
import cv2
import torch
import numpy as np
class HSVThresholdMask:
def __init__(self):
pass
@classmethod
def INPUT_TYPES(s):
return {
"required": {
"image": ("IMAGE",),
"low_threshold": ("FLOAT", {
"default": 0.2,
"min": 0,
"max": 1,
"step": 0.1
}),
"high_threshold": ("FLOAT", {
"default": 0.7,
"min": 0,
"max": 1,
"step": 0.1
}),
"hsv_channel": (["hue", "saturation", "value"],),
},
}
RETURN_TYPES = ("IMAGE",)
FUNCTION = "hsv_threshold"
CATEGORY = "postprocessing/Masks"
def hsv_threshold(self, image: torch.Tensor, low_threshold: float, high_threshold: float, hsv_channel: str):
batch_size, height, width, _ = image.shape
result = torch.zeros(batch_size, height, width)
if hsv_channel == "hue":
channel = 0
low_threshold, high_threshold = int(low_threshold * 180), int(high_threshold * 180)
elif hsv_channel == "saturation":
channel = 1
low_threshold, high_threshold = int(low_threshold * 255), int(high_threshold * 255)
elif hsv_channel == "value":
channel = 2
low_threshold, high_threshold = int(low_threshold * 255), int(high_threshold * 255)
for b in range(batch_size):
tensor_image = (image[b].numpy().copy() * 255).astype(np.uint8)
hsv_image = cv2.cvtColor(tensor_image, cv2.COLOR_RGB2HSV)
mask = cv2.inRange(hsv_image[:, :, channel], low_threshold, high_threshold)
tensor = torch.from_numpy(mask).float() / 255.
result[b] = tensor
return (result,)
NODE_CLASS_MAPPINGS = {
"HSVThresholdMask": HSVThresholdMask,
}
+57 -2
View File
@@ -166,7 +166,7 @@ class Blur:
return (blurred,) return (blurred,)
class CannyEdgeDetection: class CannyEdgeMask:
def __init__(self): def __init__(self):
pass pass
@@ -717,6 +717,60 @@ class Glow:
def add_glow(self, img, blurred_img, intensity): def add_glow(self, img, blurred_img, intensity):
return img + blurred_img * intensity return img + blurred_img * intensity
class HSVThresholdMask:
def __init__(self):
pass
@classmethod
def INPUT_TYPES(s):
return {
"required": {
"image": ("IMAGE",),
"low_threshold": ("FLOAT", {
"default": 0.2,
"min": 0,
"max": 1,
"step": 0.1
}),
"high_threshold": ("FLOAT", {
"default": 0.7,
"min": 0,
"max": 1,
"step": 0.1
}),
"hsv_channel": (["hue", "saturation", "value"],),
},
}
RETURN_TYPES = ("IMAGE",)
FUNCTION = "hsv_threshold"
CATEGORY = "postprocessing/Masks"
def hsv_threshold(self, image: torch.Tensor, low_threshold: float, high_threshold: float, hsv_channel: str):
batch_size, height, width, _ = image.shape
result = torch.zeros(batch_size, height, width)
if hsv_channel == "hue":
channel = 0
low_threshold, high_threshold = int(low_threshold * 180), int(high_threshold * 180)
elif hsv_channel == "saturation":
channel = 1
low_threshold, high_threshold = int(low_threshold * 255), int(high_threshold * 255)
elif hsv_channel == "value":
channel = 2
low_threshold, high_threshold = int(low_threshold * 255), int(high_threshold * 255)
for b in range(batch_size):
tensor_image = (image[b].numpy().copy() * 255).astype(np.uint8)
hsv_image = cv2.cvtColor(tensor_image, cv2.COLOR_RGB2HSV)
mask = cv2.inRange(hsv_image[:, :, channel], low_threshold, high_threshold)
tensor = torch.from_numpy(mask).float() / 255.
result[b] = tensor
return (result,)
class KuwaharaBlur: class KuwaharaBlur:
def __init__(self): def __init__(self):
pass pass
@@ -1265,7 +1319,7 @@ NODE_CLASS_MAPPINGS = {
"ArithmeticBlend": ArithmeticBlend, "ArithmeticBlend": ArithmeticBlend,
"Blend": Blend, "Blend": Blend,
"Blur": Blur, "Blur": Blur,
"CannyEdgeDetection": CannyEdgeDetection, "CannyEdgeMask": CannyEdgeMask,
"ChromaticAberration": ChromaticAberration, "ChromaticAberration": ChromaticAberration,
"ColorCorrect": ColorCorrect, "ColorCorrect": ColorCorrect,
"ColorTint": ColorTint, "ColorTint": ColorTint,
@@ -1273,6 +1327,7 @@ NODE_CLASS_MAPPINGS = {
"DodgeAndBurn": DodgeAndBurn, "DodgeAndBurn": DodgeAndBurn,
"FilmGrain": FilmGrain, "FilmGrain": FilmGrain,
"Glow": Glow, "Glow": Glow,
"HSVThresholdMask": HSVThresholdMask,
"KuwaharaBlur": KuwaharaBlur, "KuwaharaBlur": KuwaharaBlur,
"Parabolize": Parabolize, "Parabolize": Parabolize,
"PencilSketch": PencilSketch, "PencilSketch": PencilSketch,