StephaneBah's picture
v1
08aeadf verified
raw
history blame
4.56 kB
import os
import gradio as gr
from PIL import Image
import numpy as np
import cv2
import matplotlib.pyplot as plt
# Fonctions de traitement d'image
def load_image(image):
return image
def apply_negative(image):
img_np = np.array(image)
negative = 255 - img_np
return Image.fromarray(negative)
def grayscale(image):
return image.convert('L')
def binarize_image(image, threshold):
img_np = np.array(image.convert('L'))
_, binary = cv2.threshold(img_np, threshold, 255, cv2.THRESH_BINARY)
return Image.fromarray(binary)
def resize_image(image, width: int, height: int):
return image.resize((width, height))
def rotate_image(image, angle):
return image.rotate(angle)
def show_histogram(image):
grayscale = image.convert("L")
plt.hist(grayscale, bins=120)
#hist_data = grayscale.histogram()
plt.figure()
plt.plot(hist_data)
plt.title("Histogramme des Niveaux de Gris")
plt.show()
def gaussian_filter(image, shape=(3,3)):
image = np.array(image)
filtered = cv2.GaussianBlur(image, shape, 0)
return Image.fromarray(filtered)
def mean_filter(image, shape=(3,3)):
image = np.array(image)
filtered = cv2.blur(image, shape)
return Image.fromarray(filtered)
def sobel_edges(image, k=5):
image = np.array(image.convert('L'))
sobel_x = cv2.Sobel(image, cv2.CV_64F, 1, 0, ksize=k)
sobel_y = cv2.Sobel(image, cv2.CV_64F, 0, 1, ksize=k)
sobel_combined = cv2.magnitude(sobel_x, sobel_y)
return Image.fromarray(np.uint8(sobel_combined))
def erosion(image, noyau=(5,5), iterations=3):
image = np.array(image.convert("L"))
kernel = np.ones(noyau, np.uint8)
eroded_image = cv2.erode(image, kernel, iterations=iterations)
return Image.fromarray(eroded_image)
def dilatation(image, noyau=(5,5), iterations=3):
image = np.array(image.convert("L"))
kernel = np.ones(noyau, np.uint8)
dilated_image = cv2.dilate(image, kernel, iterations=iterations)
return Image.fromarray(dilated_image)
# Ajoutez d'autres fonctions pour l'histogramme, le filtrage, Sobel, etc.
# Interface Gradio
def image_processing(image, operation, threshold=128, width=100, height=100, angle=30, shape=(3,3), noyau=(5,5), k=5, iterations=3):
if operation == "Négatif":
return apply_negative(image)
elif operation == "Image en Gris":
return grayscale(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 de Gris':
return show_histogram(image)
elif operation == 'Filtre Gaussien':
return gaussian_filter(image, shape)
elif operation == 'Filtre Moyen':
return mean_filter(image, shape)
elif operation == 'Sobel Edges Extraction':
return sobel_edges(image, k)
elif operation == 'Erosion':
return erosion(image, noyau, iterations)
elif operation == 'Dilatation':
return dilatation(image)
# Ajouter d'autres conditions pour les autres opérations
return image
# Interface Gradio
with gr.Blocks() as demo:
gr.Markdown("## Projet de Traitement d'Image")
with gr.Row():
operation = gr.Radio(["Négatif", "Image en Gris", "Binarisation", "Redimensionner", "Rotation", 'Histogramme de Gris',
'Filtre Gaussien', 'Filtre Moyen', 'Sobel Edges Extraction', 'Erosion', 'Dilatation'], label="Opération")
threshold = gr.Slider(0, 255, 128, label="Seuil de binarisation", visible=True)
width = gr.Number(value=100, label="Largeur", visible=True)
height = gr.Number(value=100, label="Hauteur", visible=True)
angle = gr.Slider(0, 360, 30, label="Angle de Rotation", visible=True)
k = gr.Number(value=5, label="k de Sobel", visible=True)
iterations = gr.Number(value=3, label="Nombre d'iteration pour les transformations morphologiques", visible=True)
with gr.Row():
image_input = gr.Image(type="pil", label="Charger Image")
image_output = gr.Image(type="pil", 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)
# Lancer l'application Gradio
demo.launch()