improcess / app.py
jugggernault's picture
feat: add laplacian edge detector
7ac80ce
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()