Spaces:
Sleeping
Sleeping
File size: 3,893 Bytes
f45aefd 50e7fdf f45aefd d835849 f45aefd 1e24872 a1c4898 d835849 1e24872 a1c4898 1e24872 d835849 1e24872 a1c4898 d707b83 a1c4898 d707b83 f45aefd d835849 6c92a72 5312728 a1c4898 6c92a72 a1c4898 d835849 5312728 d835849 a1c4898 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 |
# 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:
# Convert PIL Image to numpy array (BGR format for OpenCV)
img = np.array(img)
# 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)
# 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
# Avoid division by zero by adding a small constant
denominator = 255 - img_blur
denominator[denominator == 0] = 1 # Prevent division by zero
img_blend = cv2.multiply(img_gray, 256.0 / denominator)
# Clip values to valid range
img_blend = np.clip(img_blend, 0, 255).astype(np.uint8)
# Adjust brightness and contrast
sketch_with_bg = adjust_brightness_contrast(img_blend, brightness, contrast)
return sketch_with_bg
except Exception as e:
print(f"Error in convert_to_sketch: {str(e)}")
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)
# Apply contrast first
img = cv2.convertScaleAbs(img, alpha=contrast)
# Apply brightness
if brightness > 0:
img = cv2.add(img, np.ones_like(img) * brightness)
else:
img = cv2.subtract(img, np.ones_like(img) * abs(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)}")
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:
# 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)
return output_image
except Exception as e:
print(f"Error in sketch_interface: {str(e)}")
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="Cartoon to Sketch 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()
|