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