File size: 2,522 Bytes
6c92a72
 
 
 
 
 
 
 
 
d835849
 
 
6c92a72
1e24872
 
 
 
 
d835849
1e24872
 
d835849
1e24872
 
d835849
1e24872
 
d835849
1e24872
 
d835849
1e24872
 
d835849
1e24872
 
 
 
 
d835849
 
1e24872
 
 
 
 
 
d835849
1e24872
 
 
 
 
d835849
 
 
 
 
6c92a72
 
1e24872
 
 
6c92a72
 
d835849
1e24872
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
# 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, ImageTk
import numpy as np
import gradio as gr

# 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_BGR2GRAY)
    
    # 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)
    
    # Ensure the output is a valid image (PIL Image)
    return Image.fromarray(sketch)

# Create Gradio interface
interface = gr.Interface(
    fn=sketch_interface,
    inputs=[
        gr.Image(type="pil", label="Upload Image"),
        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"),
    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()