File size: 2,680 Bytes
f45aefd
50e7fdf
 
 
 
 
 
 
f45aefd
d835849
 
 
f45aefd
1e24872
 
 
f45aefd
1e24872
5312728
f45aefd
1e24872
d835849
f45aefd
1e24872
d835849
f45aefd
1e24872
d835849
f45aefd
1e24872
d835849
f45aefd
1e24872
d835849
f45aefd
1e24872
 
f45aefd
d835849
 
1e24872
 
50e7fdf
1e24872
 
 
d835849
1e24872
 
 
f45aefd
5312728
2541aba
f45aefd
 
 
 
 
 
 
5312728
0db9a41
d835849
 
 
 
6c92a72
5312728
1e24872
 
 
6c92a72
f45aefd
d835849
5312728
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
76
77
78
79
# 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):
    # 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 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)
    output_image = Image.fromarray(sketch)

    # Check if the image was properly created
    if output_image:
        print("Image processed successfully!")
    else:
        print("Failed to process image!")

    # Return the processed sketch image
    return output_image

# 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()