Projet: Fitrages par gradients | Sébastien Buron

Présentation

Le but de ce projet était d'explorer les filtrages par gradients. C'est pour cette raison qu'avec l'aide de Jean-François Lalonde j'ai décidé d'implémenter les filtres présentés dans l'article GradientShop [Article].

Algorithmes Utilitaires

Les algorithmes utilisés sont simples. Il suffit simplement de calculer les grandients d'une image, les modifier, pour ensuite les intégrer et recréer l'image. Pour ce faire, plusieurs algorithmes utilitaires ont dù être créés:

Long Edge Detector

Voici les étapes utilisées pour faire la création d'un Long Edge Detector:

1- j'ai utilisé un filtre de canny pour détecter les edges

2- j'ai utilisé la fonction regionprops pour regrouper les différents edges (n listes contenants les coordonnées des points d'un edge)

3- j'ai créé une matrice de zéro de la grandeur de l'image originale puis inséré la longeur d'un edge (longeur des listes) à chacune des coordonnées (valeurs dans les listes)

Edge Orientation Detector

Pour créer une matrice contenant l'orientation en degré des Edges detectés, j'ai simplement utilisé la matrice créée par le Long Edge Detector et j'ai utilisé la fonction imgradient pour trouver l'angle des grandients, soit seulement les edges de l'image.

Algorithmes des filtres

Les filtres implémentés sont les suivants:

Saliency sharpening

Ce filtre consiste à calculer les gradients d'une images notés Ux et Uy et les modifier de la façon suivante:

Ux = Ux + C x Sx

Uy = Uy + C x Sy

Où C est une constante et S est la fonction suivante:

Sx = Cos^2(eo) x el x Ux

Sy = Sin^2(eo) x el x Uy

Où el est le résultat du Long Edge Detector et eo est le résultat du Edge Orientation Detector.

Pseudo re-lighting

Ce filtre consiste à calculer les gradients d'une images notés Ux et Uy et les modifier de la facon suivante:

Ux = Ux + C x Ux x A

Uy = Uy + C x Uy x A

Où C est une constante et A est la fonction suivante:

num = ((Ux * cos(lo)) + (Uy * sin(lo)));

denum = (Ux^2 + Uy^2)^0.5;

A = num/denum

Où lo est la matrice d'orientation de la lumière

Non-photorealistic rendering

Ce filtre consiste à calculer les gradients d'une images noté Ux et Uy et les modifier de la facon suivante:

Ux = Ux x Cos^2(eo) x n

Uy = Uy x Sin^2(eo) x n

Où eo est le résultat du Edge Orientation Detector et n est la fonction suivante:

n = C1 x (1 - e^[(el^2) / (-2 * C2^2)])

Où C1 et C2 sont des constantes et el est le résultat du Long Edge Detector.

Le Long Edge Detector

Tous les filtres présents dans cet article utilisent un Long Edge Detector créé par GrandientShop. Le défi est de réussir à faire un Long Edge Detector, qui sera capable d'immiter celui de GradientShop. Voici l'évolution de mon algorithme:

Version 1

La première version du L.E.D consistait directement à l'algorithme présentée dans la section Introduction.

Résultat: .jpg

Version 2

Afin de tester plusieurs variations de mon L.E.D, j'ai effectué une deuxième version, qui se limitait aux edges avec les plus gros contrastes en ajoutant un threshold au filtre de canny.

Résultat: .jpg

Version 3

Pour tenter de régler des problèmes avec le filtre "Non-photorealistic rendering", la troisième version du filtre va épaissir les edges en utilisant la fonction strel et imdilate.

Résultat: .jpg

Explication

La raison de cette évolution était principalement causée par le fitre "Non-photorealistic rendering", afin de réduire le "Bleeding" sur les images. Voici un avant/après:

Avant: .jpg

Après: .jpg

Le Edge Orientation Detector

Presque tous les filtres présents dans cet article utilisent un Edge Orientation Detector créé par GrandientShop. Le défi est de réussir à faire un Edge Orientation Detector qui sera capable d'immiter celui de GradientShop. Voici l'évolution de mon algorithme:

Version 1

La première version du E.O.D consistait à simplement calculer l'angle de tous les gradients de l'image.

Résultat: .jpg

Version 2

Afin de limiter le calcul aux edges detectés par le L.E.D, il a été facile de créer une deuxieme version de l'algo, qui utilisait le L.E.D et ensuite qui allait calculer l'orientation des gradients sur celui-ci.

Résultat: .jpg

Informations Importantes:

Comme expliqué dans la présentation, ce filtre utilise 1 constante, soit C1 qui lorsque cette derniere est changé, a un impact considérable sur le résultat. Il est aussi important de mentionner que l'implémentation du Long Edge detector a aussi un important imparct sur les résultats.

Image #1

Le but de cette section était simplement de tester l'algorithme de sharpening


.jpg

l'image ci-dessus est une image non modifiée


.jpg

Voici les gradients du canal rouge original


.jpg

Voici les gradients du canal rouge modifié


.jpg

Voici le résultat du L.E.D V2


.jpg

Voici le résultat final

Image #2

Le but de cette deuxième section de résultat était de tester l'influence de C1. L'analyse suivante est faite avec C1 = 0.005


.jpg

l'image ci-dessus est une image non modifiée


.jpg

Voici les gradients du canal rouge original


.jpg

Voici les gradients du canal rouge modifié


.jpg

Voici le résultat du L.E.D V2


.jpg

Voici le résultat final

Image #3

Le but de cette deuxième section de résultat était de tester l'influence de C1. L'analyse suivante est faite avec C1 = 0.01


.jpg

l'image ci-dessus est une image non modifiée


.jpg

Voici les gradients du canal rouge original


.jpg

Voici les gradients du canal rouge modifié


.jpg

Voici le résultat du L.E.D V2


.jpg

Voici le résultat final

Conclusion

Malgré les gradients modifiés, qui semblent être plus prononcés que ceux originaux, les résultats ne sont pas ceux attendus. La cause est probablement l'intégration, car même en doublant la valeur des gradients aux edges, il y a un changement de couleurs lors de l'intégration.

Informations Importantes:

Comme expliqué dans la présentation, ce filtre utilise 2 constantes soient C1 et C2. Lorsqu'elles sont changées, elles ont un impact considérable sur le résultat. Il est aussi important de mentionner que l'implémentation du Long Edge detector a aussi un important impact sur les résultats.

Test des paramètres C1 et C2

Le but de cette premiere section de résultats était de tester l'algorithme avec une image simple afin de voir le comportement de C1 et de C2. Ces images ont été créées avec les versions 1 des algorithmes utilitaires.


.jpg

l'image ci-dessus est une image non modifiée


.jpg

Résultat1 Paramètres: C1 = 1 et C2 = 1


.jpg

Résultat2 Paramètres: C1 = 1 et C2 = 100


.jpg

Résultat3 Paramètres: C1 = 5 et C2 = 1


.jpg

Résultat4 Paramètres: C1 = 2 et C2 = 25

Test des différentes versions du L.E.D / E.O.D.

Le but de cette deuxième section de résultats était de tester l'évolution des versions des algorithmes utilitaires soient le L.E.D et le E.O.D. Les résultats ont été créées avec les valeurs C1 = 1 et C2 = 1.


.jpg

l'image ci-dessus est une image non modifiée


.jpg

Résultat1 L.E.D V1 et E.O.D V1


.jpg

Résultat2 L.E.D V3 et E.O.D V1


.jpg

Résultat2 L.E.D V1 et E.O.D V2


.jpg

Résultat4 L.E.D V3 et E.O.D V2

Test avec images plus complexes

Le but de cette section était de tester l'algorithme avec des images plus complexes à partir de l'information obtenue lors des sections précédentes. Résultats effectués avec les dernières versions des Algo utilitaires.


.jpg

l'image ci-dessus est une image non modifiée


.jpg

Résultat1 Une voiture beaucoup plus de détails


.jpg

l'image ci-dessus est une image non modifiée


.jpg

Résultat2 Il y a beaucoup trop d'edges et ceux-ci ne sont pas tous détectés par le L.E.D [Image Detecteur]


.jpg

Résultat3 La valeur de sensibilité de canny a été changée de 0.6 à 0.4 pour mieux detecter [Image Detecteur]

Conclusion

Premièrement, pour de meilleurs résultats il faut utiliser le L.E.D V3 pour éviter le "bleeding".

Finalement, le L.E.D joue un très grand rôle dans les résultats obtenus et beaucoup de paramètres entre en compte, ce qui explique la difficulté d'obtenir des résultats satisfaisants et constants. Comme les résultats en démontrent, si l'image est simple, c'est-à-dire qu'il est facile de détecter tous les edges et que ceux-ci ont environ la même intensité, les résultats seront satisfaisants apres avoir bien trouvé les paramètres de detection d'edge C1 et C2.

Informations Importante:

Comme expliqué dans la section présentation, cet algorithme utilise la constante C, qui change l'intensité de la lumière ajoutée.

Test direction et effet de la lumière

Le but cette premiere section de résultats était de tester l'effet pour voir si la lumière allait réagir le plus naturellement possible, soit une source lumineuse placée quelque part dans l'image. L'intensité de la lumière a été exagérée afin de bien visualiser l'effet et les gradients. C = 0.5


.jpg

l'image ci-dessus est une image non modifiée


.jpg

Source placée dans le coin en haut à gauche


.jpg

Source placée dans le coin en bas à droite


.jpg

Source placée coté à droite


.jpg

Source placée du coté gauche

Test Effet lumière.

Le but de cette deuxième section de résultats était de faire la même chose, mais avec une source de lumiere qui n'est pas exagérée. C = 0.1


.jpg

l'image ci-dessus est une image non modifiée


.jpg

Source placée dans le coin en haut à gauche


.jpg

Source placée dans le coin en bas à droite


.jpg

Source placée coté à droite


.jpg

Source placée du coté gauche

Test avec images aléatoires

Le but de cette troisième section de résultats était tester l'algorithme avec des images aléatoires.


.jpg

l'image ci-dessus est une image non modifiée


.jpg

Source placée dans le coin en haut à gauche. C = 0.08


.jpg

'image ci-dessus est une image non modifiée


.jpg

Source placée dans le coin en haut à gauche. C = 0.08


.jpg

Source placée dans le coin en haut à droite. C = 0.08

Conclusion

Les résultats sont satisfaisants. On peut bien voir que les ombres sont plus présentes lors de l'ajout de lumières dans les différentes images.

Conclusion

En débutant mon projet, je croyais que le défi allait être de bien manipuler les grandients afin de pouvoir implémenter les filtres, mais le vrai défi était de bien implémenter les fonctions Long Edge Detector et Edge Orientation Detector pour obtenir les résultats désirés. Beaucoup d'améliorations peuvent être apportées à ce projet comme:

1. Essayer de modifier le code d'intégration afin d'assurer une exactiude des couleurs lors du rebalancement. Ceci pourrait aider les changements de couleurs, qui apparaissaient surtout dans le fitre de sharpening.

2. Essayer un autre Long Edge Detector avec un systeme de poids différent que celui implémenté pour essayer de réduire encore plue le "bleeding".

Travail personnel réalisé dans le cadre du cours de Photographie Algorithmique (GIF-4105).

Remis à Jean-François Lalonde le 2 Mai 2018.