Spaces:
Runtime error
Runtime error
| import gradio as gr | |
| from PIL import Image, ImageFilter | |
| import numpy as np | |
| import cv2 | |
| from skimage import morphology | |
| import matplotlib.pyplot as plt | |
| import io | |
| # Images manipulation functions | |
| #Image loading | |
| def load_image(image_path): | |
| '''Load image with PIL''' | |
| image=Image.open(image_path) | |
| return image | |
| #Negative APPLYING | |
| def apply_negative(image): | |
| ''' | |
| input: PIL Image | |
| output : PIL Image | |
| Image loaded with PIL is turned to numpy format. Then, we calculate the new pixels values and image gotten is return to PIL format''' | |
| img_np = np.array(image) | |
| negative = 255 - img_np | |
| return Image.fromarray(negative) | |
| #binarization | |
| def binarize_image(image, threshold_value): | |
| ''' | |
| inputs : PIL image ; threshold_value | |
| output : PIL image | |
| Image in PIL format is converted into grayscale format and then into numpy format.Now we make a binary threshold base on threshold value. | |
| Image gotten is returned to Image format''' | |
| img_np = np.array(image.convert('L')) | |
| _, binary = cv2.threshold(img_np, threshold_value, 255, cv2.THRESH_BINARY) | |
| return Image.fromarray(binary) | |
| #image resizing | |
| def resize_image(image, width, height): | |
| '''Resizing is doing by using PIL resizing method''' | |
| return image.resize((width, height)) | |
| #image rotation | |
| def rotate_image(image, angle): | |
| '''Rotation is doing by using PIL rotation method''' | |
| return image.rotate(angle) | |
| #Image histogram | |
| def histogram(image): | |
| img = np.array(image.convert('L')) | |
| hist = cv2.calcHist([img],[0],None,[256],[0,256]) | |
| plt.plot(hist) | |
| img_buf = io.BytesIO() | |
| plt.savefig(img_buf, format='png') | |
| return Image.open(img_buf) | |
| #Gaussian filter | |
| def g_filter(image): | |
| img_gauss = image.filter(ImageFilter.GaussianBlur(5) ) | |
| return img_gauss | |
| #Sobel | |
| def sobel_f(image): | |
| i = np.array(image) | |
| img = cv2.GaussianBlur(i, (3, 3), sigmaX=0, sigmaY=0) | |
| edge_sobel = cv2.Sobel(src=img, ddepth=cv2.CV_8U, dx=1, dy=1, ksize=5) | |
| return Image.fromarray(edge_sobel) | |
| #erosion | |
| def erosion(image): | |
| i=np.array(image.convert('L')) | |
| ero_img= morphology.binary_erosion(i, morphology.disk(1)) | |
| return Image.fromarray(ero_img) | |
| #dilatation | |
| def dilatation(image): | |
| i=np.array(image.convert('L')) | |
| ero_img= morphology.binary_dilation(i, morphology.disk(1)) | |
| return Image.fromarray(ero_img) | |
| #contour | |
| def contour(image): | |
| return image.filter(ImageFilter.CONTOUR) | |
| #lumineux | |
| def lumineux(image): | |
| return image.filter(ImageFilter.EDGE_ENHANCE) | |
| #Netteté | |
| def nette(image): | |
| return image.filter(ImageFilter.SHARPEN) | |
| # Interface Gradio | |
| def image_processing(image, operation, threshold=128, width=100, height=100, angle=0): | |
| if operation == "Négatif": | |
| return apply_negative(image) | |
| elif operation == "Binarisation": | |
| return binarize_image(image, threshold) | |
| elif operation == "Redimensionner": | |
| return resize_image(image, width, height) | |
| elif operation == "Rotation": | |
| return rotate_image(image, angle) | |
| elif operation == "Histogramme": | |
| return histogram(image) | |
| elif operation == "Gaussian Filter": | |
| return g_filter(image) | |
| elif operation == "Sobel": | |
| return sobel_f(image) | |
| elif operation == "Erosion": | |
| return erosion(image) | |
| elif operation == "Dilatation": | |
| return erosion(image) | |
| elif operation == "Contour": | |
| return contour(image) | |
| elif operation == "Luminosité": | |
| return lumineux(image) | |
| elif operation == "Netteté": | |
| return nette(image) | |
| return image | |
| # Gradio Interface | |
| with gr.Blocks() as demo: | |
| gr.Markdown("## Mini photoshop") | |
| with gr.Row(): | |
| image_input = gr.Image(type="pil", label="Charger Image") | |
| operation = gr.Radio(["Négatif", "Binarisation", "Redimensionner", "Rotation","Histogramme","Gaussian Filter","Sobel", "Erosion","Dilatation","Luminosité","Contour", "Netteté"], label="Opération") | |
| threshold = gr.Slider(0, 255, 128, label="Seuil de binarisation", visible=True) | |
| width = gr.Number(value=100, label="Largeur de redimensionnement", visible=True) | |
| height = gr.Number(value=100, label="Hauteur de redimensionnement", visible=True) | |
| angle = gr.Number(value=0, label="Angle de Rotation", visible=True) | |
| image_output = gr.Image(label="Image Modifiée") | |
| submit_button = gr.Button("Appliquer") | |
| submit_button.click(image_processing, inputs=[image_input, operation, threshold, width, height, angle], outputs=image_output) | |
| # Launch application | |
| demo.launch() | |