File size: 6,231 Bytes
08aeadf
 
 
 
 
 
b6ec593
08aeadf
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
b6ec593
 
 
08aeadf
 
 
 
 
 
b6ec593
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
08aeadf
 
 
 
b6ec593
08aeadf
 
 
 
 
b6ec593
08aeadf
 
 
 
 
 
b6ec593
 
08aeadf
b6ec593
08aeadf
 
 
b6ec593
 
08aeadf
b6ec593
08aeadf
 
 
 
 
b6ec593
 
08aeadf
b6ec593
08aeadf
b6ec593
08aeadf
b6ec593
08aeadf
b6ec593
08aeadf
b6ec593
08aeadf
b6ec593
08aeadf
b6ec593
08aeadf
b6ec593
08aeadf
b6ec593
08aeadf
b6ec593
 
 
08aeadf
 
 
b6ec593
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
08aeadf
 
b6ec593
 
08aeadf
b6ec593
 
 
 
 
 
 
 
08aeadf
b6ec593
08aeadf
 
 
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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
import os
import gradio as gr
from PIL import Image
import numpy as np
import cv2
import matplotlib.pyplot as plt
import io

# 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, height):
    width = int(width)
    height = int(height)
    return image.resize((width, height))

def rotate_image(image, angle):
    return image.rotate(angle)

def show_histogram(image):
    image_gray = image.convert("L")
    # Obtenir les données de l'image en niveaux de gris
    image_array = np.array(image_gray)
    # Calculer l'histogramme
    hist, bins = np.histogram(image_array.flatten(), bins=256, range=[0,256])
    # Créer une figure pour l'affichage de l'histogramme
    fig, ax = plt.subplots()
    ax.plot(hist, color='blue')
    ax.set_xlim([0, 256])
    ax.set_title('Histogram of Image')
    # Enregistrer l'histogramme dans un buffer
    buf = io.BytesIO()
    plt.savefig(buf, format='png')
    buf.seek(0)
    # Ouvrir l'image du buffer en utilisant PIL
    hist_image = Image.open(buf)
    return hist_image

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):
    k = int(k)
    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, iterations=3, shape=(5, 5)):
    iterations = int(iterations)
    image = np.array(image.convert("L"))
    kernel = np.ones(shape, np.uint8)
    eroded_image = cv2.erode(image, kernel, iterations=iterations)
    return Image.fromarray(eroded_image)

def dilatation(image, iterations=3, shape=(5, 5)):
    iterations = int(iterations)
    image = np.array(image.convert("L"))
    kernel = np.ones(shape, np.uint8)
    dilated_image = cv2.dilate(image, kernel, iterations=iterations)
    return Image.fromarray(dilated_image)


# Interface Gradio
def image_processing(image, operation, modified_image, threshold=128, width=100, height=100, angle=30, k=5, iterations=3):
    current_image = modified_image if modified_image is not None else image
    if operation == "Négatif":
        current_image = apply_negative(image)
    elif operation == "Image en Gris":
        current_image = grayscale(image)
    elif operation == "Binarisation":
        current_image = binarize_image(image, threshold)
    elif operation == "Redimensionner":
        current_image = resize_image(image, width, height)
    elif operation == "Rotation":
        current_image = rotate_image(image, angle)
    elif operation == 'Filtre Gaussien':
        current_image = gaussian_filter(image)
    elif operation == 'Filtre Moyen':
        current_image = mean_filter(image)
    elif operation == 'Sobel Edges Extraction':
        current_image = sobel_edges(image, k)
    elif operation == 'Erosion':
        current_image = erosion(image, iterations)
    elif operation == 'Dilatation':
        current_image = dilatation(image, iterations)

    return current_image, show_histogram(current_image)

# Interface Gradio
with gr.Blocks() as demo:
    gr.Markdown("## Traitement d'Images")

    with gr.Row():
        operation = gr.Radio(["Négatif", "Image en Gris", "Binarisation", "Redimensionner", "Rotation", 'Filtre Gaussien',
                         'Filtre Moyen', 'Sobel Edges Extraction', 'Erosion', 'Dilatation'], label="Opération", value="Négatif")
    with gr.Row():
        threshold = gr.Slider(0, 255, 128, label="Seuil de binarisation", visible=False)
        width = gr.Number(value=100, label="Largeur", visible=False)
        height = gr.Number(value=100, label="Hauteur", visible=False)
        angle = gr.Slider(0, 360, 30, label="Angle de Rotation", visible=False)
        k = gr.Number(value=5, label="k de Sobel", visible=False)
        iterations = gr.Number(value=3, label="Nombre d'iteration pour les transformations morphologiques", visible=False)

    def update_ui(operation):
        # Mise à jour dynamique de la visibilité des champs
        return {
            threshold: gr.update(visible=operation == "Binarisation"),
            width: gr.update(visible=operation == "Redimensionner"),
            height: gr.update(visible=operation == "Redimensionner"),
            angle: gr.update(visible=operation == "Rotation"),
            k: gr.update(visible=operation == "Sobel Edges Extraction"),
            iterations: gr.update(visible=operation in ["Erosion", "Dilatation"])
        }

    operation.change(update_ui, operation, [threshold, width, height, angle, k, iterations])

    with gr.Row():
        image_input = gr.Image(type="pil", label="Charger Image", scale=2)
        original_hist = gr.Image(label="Histogramme de l'Image Originale", scale=1)
    with gr.Row():
        image_output = gr.Image(type="pil", label="Image Modifiée", interactive=False)
        modified_hist = gr.Image(label="Histogramme de l'Image Modifiée", scale=1)

    # Afficher l'histogramme de l'image d'entrée
    def s_hist(image):
        return show_histogram(image)
    image_input.change(s_hist, inputs=image_input, outputs=original_hist)

    submit_button = gr.Button("Appliquer")
    submit_button.click(image_processing, inputs=[image_input, operation, image_output, threshold, width, height, angle, k, iterations], outputs=[image_output, modified_hist])

# Lancer l'application Gradio
demo.launch()