Spaces:
Sleeping
Sleeping
| # -*- coding: utf-8 -*- | |
| """app code for remove.ipynb | |
| Automatically generated by Colab. | |
| Original file is located at | |
| https://colab.research.google.com/drive/1GoN403JoCKCLavITeCYoMzFXKctQ83en | |
| """ | |
| from IPython import get_ipython | |
| from IPython.display import display | |
| # %% | |
| import gradio as gr | |
| from PIL import Image | |
| import numpy as np | |
| import cv2 # Import OpenCV | |
| def sanitize_hex_color(color): | |
| """ | |
| Sanitize and validate hex color input. | |
| """ | |
| if color.startswith('rgb'): | |
| rgb_vals = color.strip('rgb()').split(',') | |
| if len(rgb_vals) == 3: | |
| try: | |
| r, g, b = map(int, rgb_vals) | |
| return f'#{r:02x}{g:02x}{b:02x}'.upper() | |
| except ValueError: | |
| raise ValueError("Invalid RGB color format") | |
| color = color.strip().upper() | |
| color = color.lstrip('#') | |
| if len(color) != 6: | |
| raise ValueError("Invalid hex color. Use '#RRGGBB' format") | |
| try: | |
| int(color, 16) | |
| except ValueError: | |
| raise ValueError("Invalid hexadecimal color") | |
| return f'#{color}' | |
| def remove_background_color(image, hex_color, tolerance): | |
| """ | |
| Remove pixels of a specified hex color from an image, | |
| with edge detection for refinement. | |
| """ | |
| if isinstance(image, np.ndarray): | |
| image = Image.fromarray(image) | |
| image = image.convert("RGBA") | |
| try: | |
| hex_color = sanitize_hex_color(hex_color) | |
| target_color = tuple(int(hex_color.lstrip('#')[i:i+2], 16) for i in (0, 2, 4)) | |
| except ValueError as e: | |
| raise ValueError(str(e)) | |
| data = np.array(image) | |
| mask = np.all(np.abs(data[:,:,:3] - target_color) <= tolerance, axis=2) | |
| # Edge detection using Canny | |
| edges = cv2.Canny(cv2.cvtColor(data, cv2.COLOR_RGBA2GRAY), 100, 200) | |
| # Adjust thresholds (100, 200) as needed | |
| # Refine mask based on edges | |
| kernel = np.ones((3, 3), np.uint8) | |
| dilated_edges = cv2.dilate(edges, kernel, iterations=1) | |
| mask = np.logical_or(mask, dilated_edges) | |
| alpha_channel = np.where(mask, 0, 255) | |
| data[:, :, 3] = alpha_channel | |
| return data | |
| def color_remover_interface(image, hex_color, tolerance, _=None): | |
| """ | |
| Gradio interface function for color removal. | |
| """ | |
| try: | |
| if image is None: | |
| raise ValueError("Please upload an image") | |
| hex_color = sanitize_hex_color(hex_color) | |
| processed_image = remove_background_color(image, hex_color, tolerance) | |
| return processed_image # Return only the processed image | |
| except Exception as e: | |
| gr.Warning(str(e)) | |
| return image # Return original image in case of error | |
| # Deploy using Gradio Client | |
| iface = gr.Interface( | |
| fn=color_remover_interface, | |
| inputs=[ | |
| gr.Image(type="numpy", label="Upload Image"), | |
| gr.Textbox(label="Enter the hex code of the colour you want to remove", placeholder="#FFFFFF"), | |
| gr.Slider(minimum=0, maximum=255, value=40, step=1, label="Colour Tolerance, adjust this to be higher if background doesn't remove"), | |
| gr.ColorPicker(label="Pick a Colour to find its hex value") # Color picker remains | |
| ], | |
| outputs=[ | |
| gr.Image(type="pil", image_mode="RGBA", label="Processed Image", format='png') | |
| ], | |
| title="Background remover for any image", | |
| description=""" | |
| Remove a specific colour from your image with precision! | |
| ### How to Use: | |
| 1. Upload an image | |
| 2. Choose the colour to remove (Enter the hex code, the colour picker at the bottom of the page will help find this hex code) | |
| 3. Adjust the colour tolerance (higher numbers will remove more) | |
| 4. See the magic happen! | |
| """, | |
| ) | |
| iface.launch(share=True) # Launch the interface with a shareable link |