import gradio as gr import numpy as np import cv2 import modules.scripts as scripts from modules import images from modules.shared import opts from cv2.ximgproc import guidedFilter from modules.processing import process_images class Script(scripts.Script): def title(self): return "AdverseCleaner" def show(self, is_img2img): return True def ui(self, is_img2img): info = gr.Markdown(''' ### Bilateral Filter ''') bilateral_steps = gr.Slider(minimum=1, maximum=128, step=1, value=64, label="Bilateral Steps") diameter = gr.Slider(minimum=1, maximum=30, step=1, value=5, label="Diameter") sigma_color = gr.Slider(minimum=1, maximum=30, step=1, value=8, label="SigmaColor") sigma_space = gr.Slider(minimum=1, maximum=30, step=1, value=8, label="SigmaSpace") info2 = gr.Markdown(''' ### Guided Filter ''') guided_steps = gr.Slider(minimum=1, maximum=64, step=1, value=4, label="Guided Steps") radius = gr.Slider(minimum=1, maximum=30, step=1, value=4, label="Radius") eps = gr.Slider(minimum=1, maximum=30, step=1, value=16, label="Accuracy") return [info, bilateral_steps, diameter, sigma_color, sigma_space, info2, guided_steps, radius, eps] def run(self, p, _, bilateral_steps, diameter, sigma_color, sigma_space, __, guided_steps, radius, eps): from PIL import Image has_grid = False proc = process_images(p) unwanted_grid_because_of_img_count = len( proc.images) < 2 and opts.grid_only_if_multiple if (opts.return_grid or opts.grid_save) and not p.do_not_save_grid and not unwanted_grid_because_of_img_count: has_grid = True def process(im,i): outpath = p.outpath_grids if has_grid and i == 0 else p.outpath_samples img = cv2.cvtColor( np.array(im), cv2.COLOR_RGB2BGR).astype(np.float32) y = img.copy() for _ in range(bilateral_steps): y = cv2.bilateralFilter(y, diameter, sigma_color, sigma_space) for _ in range(guided_steps): y = guidedFilter(img, y, radius, eps) out_image = Image.fromarray(cv2.cvtColor( y.clip(0, 255).astype(np.uint8), cv2.COLOR_BGR2RGB)) images.save_image(out_image, outpath, "img_", proc.seed + i, proc.prompt, "png", info=proc.info, p=p) return out_image for i in range(len(proc.images)): proc.images.append(process(proc.images[i], i)) return proc