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].
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:
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)
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.
Les filtres implémentés sont les suivants:
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.
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
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.
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:
La première version du L.E.D consistait directement à l'algorithme présentée dans la section Introduction.
Résultat:
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:
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:
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:
Après:
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:
La première version du E.O.D consistait à simplement calculer l'angle de tous les gradients de l'image.
Résultat:
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:
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.
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.
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.
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.
Comme expliqué dans la section présentation, cet algorithme utilise la constante C, qui change l'intensité de la lumière ajoutée.
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.
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.