File size: 2,739 Bytes
50e7fdf
 
 
 
 
 
 
 
128db64
d835849
 
2541aba
d835849
6c92a72
1e24872
 
 
 
 
128db64
1e24872
 
d835849
1e24872
 
d835849
1e24872
 
d835849
1e24872
 
d835849
1e24872
 
d835849
1e24872
 
 
 
 
d835849
 
1e24872
 
50e7fdf
1e24872
 
 
d835849
1e24872
 
 
 
128db64
2541aba
 
0db9a41
 
d835849
 
 
 
6c92a72
128db64
1e24872
 
 
6c92a72
0db9a41
d835849
128db64
d835849
 
 
 
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
# 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
import os

# Function to convert image to sketch
def convert_to_sketch(img, blur_strength, brightness, contrast):
    # Convert PIL Image to numpy array
    img = np.array(img)
    
    # Convert the image to grayscale
    img_gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
    
    # Invert the grayscale image
    img_inverted = cv2.bitwise_not(img_gray)
    
    # Apply Gaussian blur to the inverted image
    img_blur = cv2.GaussianBlur(img_inverted, (blur_strength, blur_strength), sigmaX=0, sigmaY=0)
    
    # Blend the grayscale and blurred inverted images to create the sketch effect
    img_blend = cv2.divide(img_gray, 255 - img_blur, scale=256)
    
    # Create a white background
    white_background = 255 * np.ones_like(img_blend)
    
    # Add the blended image to the white background
    sketch_with_bg = cv2.addWeighted(img_blend, 1, white_background, 1, 0)
    
    # Adjust brightness and contrast
    sketch_with_bg = adjust_brightness_contrast(sketch_with_bg, brightness, contrast)
    
    # Return the adjusted sketch image
    return sketch_with_bg

# Function to adjust brightness and contrast
def adjust_brightness_contrast(img, brightness, contrast):
    # Apply contrast adjustment
    img = cv2.convertScaleAbs(img, alpha=contrast, beta=brightness)
    return img

# Gradio interface function
def sketch_interface(image, blur_strength, brightness, contrast):
    # Convert the input image to a sketch with adjustments
    sketch = convert_to_sketch(image, blur_strength, brightness, contrast)
    
    # Convert numpy array to PIL Image before returning
    output_image = Image.fromarray(sketch)
    
    # Return the processed sketch image for display
    return output_image

# Create Gradio interface
interface = gr.Interface(
    fn=sketch_interface,
    inputs=[
        gr.Image(type="pil", label="Upload Image", image_mode="RGB", shape=(256, 256)),  # Support for various formats
        gr.Slider(1, 51, step=2, label="Blur Strength", value=21),
        gr.Slider(-100, 100, label="Brightness", value=0),
        gr.Slider(1, 3, step=0.1, label="Contrast", value=1)
    ],
    outputs=[gr.Image(type="pil", label="Sketch Output")],  # Output is now just the image
    title="Cartoon to Sketch Converter",
    description="Upload an image (PNG, JPEG, or others) to convert it into a sketch. Adjust the blur strength, brightness, and contrast for different effects."
)

# Launch the Gradio app
interface.launch()