cwthomp5/homework
0
1import gradio as gr2import numpy as np3from PIL import Image, ImageFilter4import cv25 6 7def apply_gaussian_blur(image, radius):8 pil_img = Image.fromarray(image)9 blurred = pil_img.filter(ImageFilter.GaussianBlur(radius=radius))10 return np.array(blurred)11 12 13def apply_lens_blur(image, radius, intensity):14 kernel_size = max(3, 2 * radius + 1)15 kernel = np.zeros((kernel_size, kernel_size), dtype=np.float32)16 center = radius17 cv2.circle(kernel, (center, center), radius, 1, -1)18 kernel /= kernel.sum()19 20 img_float = image.astype(np.float32)21 blurred_channels = []22 for c in range(img_float.shape[2]):23 channel = img_float[:, :, c]24 blurred_channel = cv2.filter2D(channel, -1, kernel)25 blurred_channels.append(blurred_channel)26 27 blurred = np.stack(blurred_channels, axis=2)28 output = cv2.addWeighted(img_float, 1 - intensity, blurred, intensity, 0)29 return np.clip(output, 0, 255).astype(np.uint8)30 31 32def process_image(image, effect_type, gaussian_radius, lens_radius, lens_intensity):33 if image is None:34 return None, "Please upload an image first."35 36 img_array = np.array(image)37 38 if effect_type == "Gaussian Blur":39 result = apply_gaussian_blur(img_array, radius=gaussian_radius)40 label = f"Gaussian Blur — Radius: {gaussian_radius}"41 else:42 result = apply_lens_blur(img_array, radius=int(lens_radius), intensity=lens_intensity)43 label = f"Lens Blur — Radius: {lens_radius}, Intensity: {lens_intensity:.2f}"44 45 return Image.fromarray(result), label46 47 48with gr.Blocks(title="Blur Effects Studio") as demo:49 50 gr.Markdown("# 🔭 Blur Effects Studio")51 gr.Markdown("Upload an image and apply **Gaussian Blur** or **Lens (Bokeh) Blur**.")52 53 with gr.Row():54 with gr.Column():55 input_image = gr.Image(type="pil", label="Upload Image")56 effect_type = gr.Radio(57 choices=["Gaussian Blur", "Lens Blur (Bokeh)"],58 value="Gaussian Blur",59 label="Effect Type",60 )61 gaussian_radius = gr.Slider(62 minimum=0.5, maximum=30.0, value=5.0, step=0.5,63 label="Gaussian Radius (for Gaussian Blur)",64 )65 lens_radius = gr.Slider(66 minimum=1, maximum=25, value=8, step=1,67 label="Lens Radius (for Lens Blur)",68 )69 lens_intensity = gr.Slider(70 minimum=0.0, maximum=1.0, value=0.8, step=0.05,71 label="Blend Intensity (for Lens Blur)",72 )73 run_btn = gr.Button("✨ Apply Effect", variant="primary")74 75 with gr.Column():76 output_image = gr.Image(label="Result")77 effect_label = gr.Textbox(label="Applied Effect", interactive=False)78 79 run_btn.click(80 fn=process_image,81 inputs=[input_image, effect_type, gaussian_radius, lens_radius, lens_intensity],82 outputs=[output_image, effect_label],83 )84 85 gr.Markdown("---")86 gr.Markdown(87 "**How to use:** Upload a photo → Select an effect → Adjust sliders → Click Apply Effect"88 )89 90 91if __name__ == "__main__":92 demo.launch()93 