import gradio as gr import cv2 import numpy as np from datetime import datetime import random ASCII_CHARS = "@%#*+=-:. " def ascii_art(image): """Converts an image to ASCII art.""" gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) height, width = gray.shape scale = 0.1 # Scaling factor to reduce the resolution for ASCII small_gray = cv2.resize(gray, (int(width * scale), int(height * scale))) ascii_image = "\n".join( "".join(ASCII_CHARS[pixel // 25] for pixel in row) for row in small_gray ) return ascii_image # Basic, classic, creative, etc., filters (no changes in their definitions) def apply_combined_filters(image, filter_types): """Applies a list of filters sequentially to the image.""" output_image = image for filter_type in filter_types: if filter_type in basic_filters_list: output_image = basic_filters(output_image, filter_type) elif filter_type in classic_filters_list: output_image = classic_filters(output_image, filter_type) elif filter_type in creative_filters_list: output_image = creative_filters(output_image, filter_type) elif filter_type in special_effects_list: if filter_type == "ASCII Art": return ascii_art(output_image) # Return ASCII output directly output_image = special_effects(output_image, filter_type) elif filter_type in artistic_filters_list: output_image = artistic_filters(output_image, filter_type) elif filter_type in atmospheric_filters_list: output_image = atmospheric_filters(output_image, filter_type) return output_image # Updated Gradio interface to allow multiple selections with gr.Blocks(theme=gr.themes.Monochrome()) as app: gr.Markdown("# 🎨 Image Filtering Studio") with gr.Row(): with gr.Column(): image_input = gr.Image(type="numpy", label="📸 Upload Photo") with gr.Accordion("â„šī¸ Filter Categories", open=True): filter_type = gr.CheckboxGroup( [ # Basic Filters "Grayscale", "Sepia", "X-Ray", "Blur", # Classic Filters "Pencil Sketch", "Sharpen", "Emboss", "Edge Detection", # Creative Filters "Pixel Art", "Mosaic Effect", "Rainbow", "Night Vision", # Special Effects "Matrix Effect", "Wave Effect", "Timestamp", "Glitch Effect", "ASCII Art", # Artistic Filters "Pop Art", "Oil Paint", "Cartoon", # Atmospheric Filters "Autumn", "Nostalgia", "Brightness Increase" ], label="🎭 Choose Filters", info="Select multiple filters to apply in sequence" ) submit_button = gr.Button("✨ Apply Filters", variant="primary") with gr.Column(): image_output = gr.Image(label="đŸ–ŧī¸ Filtered Photo") ascii_output = gr.Textbox(label="ASCII Art Output", visible=False) submit_button.click( lambda image, filters: (apply_combined_filters(image, filters) if "ASCII Art" not in filters else None, ascii_art(image) if "ASCII Art" in filters else None), inputs=[image_input, filter_type], outputs=[image_output, ascii_output] ) app.launch(share=True)