File size: 5,430 Bytes
0f02cf8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9285af4
 
 
 
 
 
 
 
 
 
 
 
0f02cf8
 
 
 
 
 
 
 
 
 
 
7ac80ce
0f02cf8
 
7ac80ce
 
 
0f02cf8
 
 
 
 
 
 
 
 
 
 
 
b7828ff
0f02cf8
b7828ff
0f02cf8
 
 
 
7ac80ce
0f02cf8
 
 
7ac80ce
9285af4
 
 
 
0f02cf8
 
 
 
9285af4
 
 
 
0f02cf8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7ac80ce
0f02cf8
 
 
9285af4
0f02cf8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9285af4
 
 
 
0f02cf8
9285af4
0f02cf8
 
 
9285af4
0f02cf8
9285af4
 
 
 
 
0f02cf8
 
 
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
158
159
import gradio as gr
import improcess
import numpy as np


# Fonction pour choisir un filtre et l'appliquer
def choose_filter(input_img, filter):
    if input_img is None:
        return None
    match filter:
        case "Gray Scale":
            return improcess.gray_scale(input_img)
        case "Gaussian Blur":
            return improcess.gaussian_blur(input_img)
        case "Binarize":
            return improcess.binarize(input_img)
        case "Negative":
            return improcess.negative(input_img)


# Fonction pour manipuler le contraste
def handle_contrast(output_image, contrast: list):
    if output_image is None:
        return None
    for trans in contrast:
        if trans == "Dark Contrast":
            output_image = improcess.log_trans(output_image)
        elif trans == "White Contrast":
            output_image = improcess.exp_trans(output_image)
    return output_image


# Fonction pour modifier la morphologie
def handle_morphology(image, morphology):
    if image is None:
        return None
    for trans in morphology:
        if trans == "Erosion":
            image = improcess.erosion(image)
        elif trans == "Dilatation":
            image = improcess.dilatation(image)
    return image


# Fonction pour egaliser l'histogramme
def equalize_hist(image, equalize):
    if equalize == True:
        return improcess.equalize(image)
    return image


def detect_feat(input_img, feature):
    if input_img is None:
        return None
    match feature:
        case "Edges(canny)":
            input_img = improcess.find_edges(input_img)
            return input_img
        case "Edges(laplacian)":
            input_img = improcess.laplacian(input_img)
            return input_img
        case "Contours":
            input_img = improcess.find_contours(input_img)
            return input_img


# Fonction pour réinitialiser l'image
def reset_img(input_img):
    return input_img


# Interface Gradio
with gr.Blocks(theme="Zarkel/IBM_Carbon_Theme") as demo:
    gr.HTML(
        """

        <h1 style='text-align: center'>Image processing lab</h1>

        """
    )
    with gr.Row():
        input_img = gr.Image(
            "profile.jpeg", label="Original image", scale=1, interactive=True
        )
        with gr.Group():
            output_img = gr.Image(
                "profile.jpeg",
                label="Transformed image",
                scale=2,
                interactive=False,
                format="png",
            )
            btn = gr.Button(value="Reset")  # Bouton de réinitialisation
    with gr.Row(variant="panel"):
        with gr.Group():
            morphology = gr.CheckboxGroup(
                choices=["Dilatation", "Erosion"], label="Morphology"
            )
            # equalize_img = gr.Checkbox(label="Equalize image")
            gamma = gr.Slider(
                minimum=0, maximum=1, label="Luminosity", interactive=True, value=0
            )

            contrast = gr.CheckboxGroup(
                choices=["Dark Contrast", "White Contrast"], label="Contrast"
            )
            angle = gr.Slider(label="Rotation (deg)", minimum=0, maximum=360)
        with gr.Group():
            scale = gr.Slider(
                minimum=0.1, maximum=1.5, value=1, label="Resize", info="Choose a scale"
            )
            filter = gr.Dropdown(
                interactive=True,
                label="Apply filter",
                choices=["Gray Scale", "Binarize", "Negative", "Gaussian Blur"],
            )
            features = gr.Dropdown(
                choices=["Contours", "Edges(canny)", "Edges(laplacian)"],
                interactive=True,
                label="Extract feature",
            )
            show_histogram = gr.Button(value="Show Histogram")

    # Mise à jour de l'image lorsqu'un filtre est appliqué
    filter.change(fn=choose_filter, inputs=[input_img, filter], outputs=output_img)

    # Mise à jour de l'image avec redimensionnement
    scale.change(fn=improcess.resize, inputs=[input_img, scale], outputs=output_img)

    # Bouton de réinitialisation de l'image
    btn.click(fn=reset_img, inputs=[input_img], outputs=[output_img])

    # Mise à jour de l'image avec correction de gamma
    gamma.change(
        fn=improcess.gamma_trans, inputs=[input_img, gamma], outputs=[output_img]
    )

    # Mise à jour de l'image avec contraste
    contrast.change(
        fn=handle_contrast, inputs=[output_img, contrast], outputs=output_img
    )
    # Mise à jour de l'image avec une transformation morphologique
    morphology.change(
        fn=handle_morphology, inputs=[input_img, morphology], outputs=output_img
    )
    # Egaliser l'histogramme de l'image
    # equalize_img.change(fn=equalize_hist, inputs=[input_img], outputs=[output_img])
    # Effectuer une rotation de l'image
    angle.change(fn=improcess.rotate, inputs=[input_img, angle], outputs=[output_img])

    # Extraire les caractéristiques
    features.select(fn=detect_feat, inputs=[input_img, features], outputs=[output_img])

    # Afficher l'histogram
    show_histogram.click(
        fn=improcess.return_histogram_path, inputs=[input_img], outputs=[output_img]
    )
# Lancer l'application
if __name__ == "__main__":
    demo.launch()