Image2sketch / app.py
Besimplestudio's picture
Update app.py
e7ca56f verified
# 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()