File size: 4,297 Bytes
e431aaa
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import gradio as gr
import cv2
import numpy as np
import mediapipe as mp
from rembg import remove
from PIL import Image, ImageEnhance

# Initialisation de Mediapipe pour la détection de visage
mp_face_mesh = mp.solutions.face_mesh
face_mesh = mp_face_mesh.FaceMesh()

# Fonction pour la suppression d’arrière-plan
def remove_bg(image):
    return remove(image)

# Fonction pour la retouche beauté
def beauty_filter(image, smooth_factor=50):
    img = np.array(image)
    img_rgb = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)
    
    results = face_mesh.process(img_rgb)
    if results.multi_face_landmarks:
        mask = np.zeros_like(img_rgb)
        for face_landmarks in results.multi_face_landmarks:
            points = [(int(p.x * img.shape[1]), int(p.y * img.shape[0])) for p in face_landmarks.landmark]
            convex_hull = cv2.convexHull(np.array(points))
            cv2.fillConvexPoly(mask, convex_hull, (255, 255, 255))

        blur = cv2.GaussianBlur(img_rgb, (smooth_factor, smooth_factor), 0)
        img_rgb = np.where(mask == (255, 255, 255), blur, img_rgb)

    return Image.fromarray(cv2.cvtColor(img_rgb, cv2.COLOR_BGR2RGB))

# Fonction pour la correction automatique des couleurs
def auto_color_correction(image, brightness, contrast, saturation):
    img = ImageEnhance.Brightness(image).enhance(brightness)
    img = ImageEnhance.Contrast(img).enhance(contrast)
    img = ImageEnhance.Color(img).enhance(saturation)
    return img

# Fonction pour le maquillage virtuel
def virtual_makeup(image, lipstick_intensity, blush_intensity):
    img = np.array(image)
    img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)
    
    results = face_mesh.process(img)
    if results.multi_face_landmarks:
        for face_landmarks in results.multi_face_landmarks:
            lips = [(int(p.x * img.shape[1]), int(p.y * img.shape[0])) for p in face_landmarks.landmark[61:68]]
            cv2.fillPoly(img, [np.array(lips)], (0, 0, int(255 * lipstick_intensity)))
            
            cheek = [(int(p.x * img.shape[1]), int(p.y * img.shape[0])) for p in face_landmarks.landmark[234:236]]
            cv2.fillPoly(img, [np.array(cheek)], (int(255 * blush_intensity), 0, 0))

    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    return Image.fromarray(img)

# Interface Gradio
with gr.Blocks() as demo:
    gr.Markdown("## Éditeur de Photos IA : Retouche Beauté, Maquillage, Amélioration des Images")

    with gr.Tab("Suppression d'Arrière-Plan"):
        img_input = gr.Image(type="pil", label="Image Originale")
        img_output = gr.Image(type="pil", label="Image sans Arrière-Plan")
        btn_remove_bg = gr.Button("Supprimer l'Arrière-Plan")
        btn_remove_bg.click(remove_bg, inputs=img_input, outputs=img_output)

    with gr.Tab("Retouche Beauté"):
        img_input2 = gr.Image(type="pil", label="Image Originale")
        smooth_slider = gr.Slider(5, 100, value=50, label="Lissage de la peau")
        img_output2 = gr.Image(type="pil", label="Image Retouchée")
        btn_beauty = gr.Button("Appliquer Retouche Beauté")
        btn_beauty.click(beauty_filter, inputs=[img_input2, smooth_slider], outputs=img_output2)

    with gr.Tab("Correction des Couleurs"):
        img_input3 = gr.Image(type="pil", label="Image Originale")
        brightness = gr.Slider(0.5, 2.0, value=1.0, label="Luminosité")
        contrast = gr.Slider(0.5, 2.0, value=1.0, label="Contraste")
        saturation = gr.Slider(0.5, 2.0, value=1.0, label="Saturation")
        img_output3 = gr.Image(type="pil", label="Image Corrigée")
        btn_correct_colors = gr.Button("Corriger les Couleurs")
        btn_correct_colors.click(auto_color_correction, inputs=[img_input3, brightness, contrast, saturation], outputs=img_output3)

    with gr.Tab("Maquillage Virtuel"):
        img_input4 = gr.Image(type="pil", label="Image Originale")
        lipstick_slider = gr.Slider(0.0, 1.0, value=0.5, label="Intensité Rouge à Lèvres")
        blush_slider = gr.Slider(0.0, 1.0, value=0.5, label="Intensité Blush")
        img_output4 = gr.Image(type="pil", label="Image avec Maquillage")
        btn_makeup = gr.Button("Appliquer Maquillage Virtuel")
        btn_makeup.click(virtual_makeup, inputs=[img_input4, lipstick_slider, blush_slider], outputs=img_output4)

    demo.launch()