Spaces:
Sleeping
Sleeping
Download app.py from Besimplestudio/Image2sketch: direct link, hf CLI and curl.
- Browser
- Download file 4.48 kB
-
https://huggingface.co/spaces/Besimplestudio/Image2sketch/resolve/main/app.py
- Command line
-
hf download hf://spaces/Besimplestudio/Image2sketch/app.py
-
curl -L -o app.py https://huggingface.co/spaces/Besimplestudio/Image2sketch/resolve/main/app.py
4.48 kB
| # Attempt to import cv2 and install opencv-python-headless if not available | |
| try: | |
| import cv2 | |
| except ImportError: | |
| import subprocess | |
| subprocess.check_call(["pip", "install", "opencv-python-headless"]) | |
| import cv2 | |
| from PIL import Image | |
| import numpy as np | |
| import gradio as gr | |
| # Function to convert image to sketch | |
| def convert_to_sketch(img, blur_strength, brightness, contrast): | |
| try: | |
| # Add debug print | |
| print(f"Input image shape: {np.array(img).shape}") | |
| # Convert PIL Image to numpy array (BGR format for OpenCV) | |
| img = np.array(img) | |
| # Check if image is empty | |
| if img is None or img.size == 0: | |
| print("Error: Empty input image") | |
| return None | |
| # Ensure blur_strength is odd | |
| blur_strength = max(1, int(blur_strength)) | |
| if blur_strength % 2 == 0: | |
| blur_strength += 1 | |
| # Convert the image to grayscale | |
| img_gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY) | |
| print(f"Grayscale shape: {img_gray.shape}") | |
| # Invert the grayscale image | |
| img_inverted = 255 - img_gray | |
| # Apply Gaussian blur to the inverted image | |
| img_blur = cv2.GaussianBlur(img_inverted, (blur_strength, blur_strength), 0) | |
| # Blend the grayscale and blurred inverted images | |
| denominator = 255 - img_blur | |
| denominator[denominator == 0] = 1 # Prevent division by zero | |
| img_blend = (img_gray * 256.0) / denominator | |
| # Clip values to valid range | |
| img_blend = np.clip(img_blend, 0, 255).astype(np.uint8) | |
| print(f"Blend shape: {img_blend.shape}") | |
| # Adjust brightness and contrast | |
| sketch_with_bg = adjust_brightness_contrast(img_blend, brightness, contrast) | |
| print(f"Final output shape: {sketch_with_bg.shape}") | |
| return sketch_with_bg | |
| except Exception as e: | |
| print(f"Error in convert_to_sketch: {str(e)}") | |
| import traceback | |
| traceback.print_exc() | |
| return None | |
| # Function to adjust brightness and contrast | |
| def adjust_brightness_contrast(img, brightness, contrast): | |
| try: | |
| # Ensure brightness is within valid range | |
| brightness = float(brightness) | |
| contrast = float(contrast) | |
| # Convert to float32 for calculations | |
| img = img.astype(float) | |
| # Apply contrast | |
| img = img * contrast | |
| # Apply brightness | |
| img = img + brightness | |
| # Ensure output is in valid range | |
| img = np.clip(img, 0, 255).astype(np.uint8) | |
| return img | |
| except Exception as e: | |
| print(f"Error in adjust_brightness_contrast: {str(e)}") | |
| import traceback | |
| traceback.print_exc() | |
| return None | |
| # Gradio interface function | |
| def sketch_interface(image, blur_strength, brightness, contrast): | |
| if image is None: | |
| print("Error: No input image provided!") | |
| return None | |
| try: | |
| print(f"Input image type: {type(image)}") | |
| print(f"Input image size: {image.size}") | |
| # Convert the input image to a sketch with adjustments | |
| sketch = convert_to_sketch(image, blur_strength, brightness, contrast) | |
| if sketch is None: | |
| print("Error: Sketch conversion failed!") | |
| return None | |
| # Convert the processed numpy array back to a PIL Image | |
| output_image = Image.fromarray(sketch) | |
| print(f"Output image size: {output_image.size}") | |
| return output_image | |
| except Exception as e: | |
| print(f"Error in sketch_interface: {str(e)}") | |
| import traceback | |
| traceback.print_exc() | |
| return None | |
| # Create Gradio interface | |
| interface = gr.Interface( | |
| fn=sketch_interface, | |
| inputs=[ | |
| gr.Image(type="pil", label="Upload Image"), | |
| gr.Slider(minimum=1, maximum=51, step=2, value=21, label="Blur Strength"), | |
| gr.Slider(minimum=-100, maximum=100, value=0, label="Brightness"), | |
| gr.Slider(minimum=0.1, maximum=3, step=0.1, value=1, label="Contrast") | |
| ], | |
| outputs=gr.Image(type="pil", label="Sketch Output"), | |
| title="Image to coloring page Converter", | |
| description="Upload an image to convert it into a sketch, adjust the blur strength, brightness, and contrast for different effects." | |
| ) | |
| # Launch the Gradio app | |
| interface.launch() | |