|
|
|
|
|
import cv2 |
|
import numpy as np |
|
import gradio as gr |
|
|
|
class ImageProcesser: |
|
def __init__(self): |
|
pass |
|
|
|
|
|
def sketch_image(self, image, pencilShadow, outlineSimplify, R, G, B, mode): |
|
try: |
|
outlineBlur = (2*outlineSimplify)+1 |
|
|
|
lineColour = (R, G, B) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) |
|
|
|
gray_image_inverted = cv2.bitwise_not(gray_image) |
|
|
|
blurred_gray_image = cv2.GaussianBlur( |
|
gray_image_inverted, (pencilShadow, pencilShadow), 0) |
|
|
|
inverted_blurred_image = cv2.bitwise_not(blurred_gray_image) |
|
|
|
edgeFindingImage = cv2.GaussianBlur( |
|
gray_image, (outlineBlur, outlineBlur), 0) |
|
|
|
edges = cv2.bitwise_not(cv2.Canny(edgeFindingImage, 100, 200)) |
|
|
|
cv2.normalize( |
|
edges, edges, 0, 255, norm_type=cv2.NORM_MINMAX) |
|
|
|
edge_mask = np.zeros_like(image) |
|
edge_mask[:, :] = lineColour |
|
|
|
edges = cv2.bitwise_or( |
|
edge_mask, cv2.cvtColor(edges, cv2.COLOR_GRAY2BGR)) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (mode == 'Outline Only'): |
|
return edges |
|
elif (mode == 'Grayscale'): |
|
return gray_image |
|
|
|
elif (mode == 'With Shadow'): |
|
pencil_sketch_image = cv2.divide( |
|
gray_image, inverted_blurred_image, scale=226.0) |
|
|
|
pencil_sketch_image = cv2.cvtColor( |
|
pencil_sketch_image, cv2.COLOR_GRAY2BGR) |
|
|
|
combined_image = cv2.bitwise_and(pencil_sketch_image, edges) |
|
|
|
return combined_image |
|
elif (mode == 'Negative'): |
|
pencil_sketch_image = cv2.divide( |
|
gray_image, inverted_blurred_image, scale=226.0) |
|
|
|
combined_image = cv2.bitwise_not(pencil_sketch_image, edges) |
|
|
|
return combined_image |
|
except Exception as error: |
|
return None |
|
|
|
|
|
class GradioInterface: |
|
def __init__(self): |
|
|
|
self.imageProcesser = ImageProcesser() |
|
|
|
with gr.Blocks() as input_blocks: |
|
with gr.Row(): |
|
imageInput = gr.Image(label="Original") |
|
imageOutput = gr.Image(label='Processed') |
|
btnGenerate = gr.Button(value='Generate') |
|
with gr.Row(): |
|
sliderShadow = gr.Slider(minimum=1, maximum=27, value=9, step=2, |
|
label="Shadow Strengthen", info="9 is for outline only, 21 is with shadows") |
|
sliderOutline = gr.Slider(minimum=0, maximum=7, value=0, step=1, |
|
label="Outline Simplify", info="") |
|
with gr.Row(): |
|
sldierR = gr.Slider(label='R', minimum=0, |
|
maximum=255, step=1, value=0) |
|
sliderG = gr.Slider(label='G', minimum=0, |
|
maximum=255, step=1, value=0) |
|
sliderB = gr.Slider(label='B', minimum=0, |
|
maximum=255, step=1, value=0) |
|
|
|
|
|
radioMode = gr.Radio(["With Shadow", "Outline Only", "Negative", 'Grayscale'], |
|
label="Mode", value='With Shadow') |
|
|
|
|
|
|
|
|
|
btnGenerate.click(fn=self.imageProcesser.sketch_image, |
|
inputs=[imageInput, sliderShadow, sliderOutline, sldierR, sliderG, sliderB, radioMode], outputs=imageOutput) |
|
|
|
input_blocks.launch() |
|
|
|
if __name__ == "__main__": |
|
gradio_interface = GradioInterface() |