import cv2 as cv import numpy as np import gradio as gr def apply_gaussian_blur(frame, density): ksize = int(density) * 2 + 1 return cv.GaussianBlur(frame, (ksize, ksize), 0) def apply_sharpening_filter(frame, density): kernel = np.array([[-1, -1, -1], [-1, 8 * density, -1], [-1, -1, -1]]) return cv.filter2D(frame, -1, kernel) def apply_edge_detection(frame, density): return cv.Canny(frame, 100, 100 * density) def apply_invert_filter(frame, density): return cv.bitwise_not(frame) def adjust_brightness_contrast(frame, density): alpha = 1.0 + density / 50.0 beta = density * 2 return cv.convertScaleAbs(frame, alpha=alpha, beta=beta) def apply_grayscale_filter(frame, density): return cv.cvtColor(frame, cv.COLOR_BGR2GRAY) def apply_sepia_filter(frame, density): sepia_filter = np.array([[0.272 * density, 0.534 * density, 0.131 * density], [0.349 * density, 0.686 * density, 0.168 * density], [0.393 * density, 0.769 * density, 0.189 * density]]) return cv.transform(frame, sepia_filter) def apply_sketch_filter(frame, density): gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY) inv = cv.bitwise_not(gray) blur = cv.GaussianBlur(inv, (21, 21), 0) sketch = cv.divide(gray, 255 - blur, scale=256) return cv.multiply(sketch, density) def apply_cartoon_filter(frame, density): gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY) blur = cv.medianBlur(gray, 7) edges = cv.adaptiveThreshold(blur, 255, cv.ADAPTIVE_THRESH_MEAN_C, cv.THRESH_BINARY, 9, 10) color = cv.bilateralFilter(frame, 9, 300, 300) cartoon = cv.bitwise_and(color, color, mask=edges) return cv.multiply(cartoon, density) def apply_pixelate_filter(frame, density): pixel_size = int(density) + 1 h, w = frame.shape[:2] temp = cv.resize(frame, (w // pixel_size, h // pixel_size), interpolation=cv.INTER_LINEAR) return cv.resize(temp, (w, h), interpolation=cv.INTER_NEAREST) def apply_emboss_filter(frame, density): kernel = np.array([[-2, -1, 0], [-1, 1 * density, 1], [0, 1, 2]]) return cv.filter2D(frame, -1, kernel) def apply_brightness_contrast_adjustment(frame, density): return adjust_brightness_contrast(frame, density) def apply_sepia_tone(frame, density): return apply_sepia_filter(frame, density) def apply_filter(input_image, filter_type, density): frame = np.array(input_image) if filter_type == "Gaussian Blur": result = apply_gaussian_blur(frame, density) elif filter_type == "Sharpen": result = apply_sharpening_filter(frame, density) elif filter_type == "Edge Detection": result = apply_edge_detection(frame, density) elif filter_type == "Invert": result = apply_invert_filter(frame, density) elif filter_type == "Brightness": result = adjust_brightness_contrast(frame, density) elif filter_type == "GrayScale": result = apply_grayscale_filter(frame, density) elif filter_type == "Sepia": result = apply_sepia_filter(frame, density) elif filter_type == "Sketch": result = apply_sketch_filter(frame, density) elif filter_type == "Cartoon": result = apply_cartoon_filter(frame, density) elif filter_type == "Pixelate": result = apply_pixelate_filter(frame, density) elif filter_type == "Emboss": result = apply_emboss_filter(frame, density) elif filter_type == "Brightness/Contrast": result = apply_brightness_contrast_adjustment(frame, density) elif filter_type == "Sepia Tone": result = apply_sepia_tone(frame, density) else: result = frame return result with gr.Blocks(css=""" #filter-dropdown { width: 300px; margin: 0 auto; } #apply-button { background-color: #8B4513; color: white; font-weight: bold; margin-top: 20px; } #apply-button:hover { background-color: #8B4513; } #input-image, #output-image { width: 100%; border-radius: 10px; } h1 { text-align: center; color: #8B4513; } p { text-align: center; font-size: 20px; } """) as demo: gr.Markdown("""
Select a filter and apply it to your image :) Enjoy!
""") with gr.Row(): with gr.Column(): filter_type = gr.Radio( label="Choose a filter:", choices=["Gaussian Blur", "Sharpen", "Edge Detection", "Invert", "Brightness", "GrayScale", "Sepia", "Sketch", "Cartoon", "Pixelate", "Emboss", "Brightness/Contrast", "Sepia Tone"], value="Gaussian Blur", elem_id="filter-radio" ) density_slider = gr.Slider( minimum=1, maximum=5, step=0.1, label="Filter Intensity (Density)", value=3, elem_id="density-slider" ) input_image = gr.Image(label="Upload Image", elem_id="input-image") apply_button = gr.Button("Apply Filter", elem_id="apply-button") with gr.Column(): output_image = gr.Image(label="Filtered Image", elem_id="output-image") apply_button.click(fn=apply_filter, inputs=[input_image, filter_type, density_slider], outputs=output_image) demo.launch(share=True)