Spaces:
Running
Running
# 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() | |