L'objectif du présent TP est de créer un programme qui:
Quelques approches seront explorées
Deux autres améliorations automatiques aussi sont testées, soit:
Cette technique consiste simplement à faire glisser le canal vert sur le canal blue et à conserver l'image le résultat ayant la plus petite erreur. La même opération est répétée pour le canal rouge. Le désavantage de cette technique est la lenteur et sa précision dépend de la façon utilisée pour calculer l'erreur. Dans ce travail, deux méthodes de de calcul d'erreur ont été testées, soit la somme des différences au carré (SDC) et Structural Similarity (SSIM)
Cette technique est une amélioration de la précédante. Plutôt que de refaire un lourd calcul d'erreur à chaque déplacement de un pixel, une "pyramide" d'image est construite. L'image est rapetissé par un facteur deux jusqu'à atteindre une certaine taille. En commençant par la plus petite image, les huit déplacements de un pixel sont testés en plus de la position initiale. Ainsi, une image réduite d'un facteur 32 dont le décalage mesuré est -1, 0 signifie que le déplacement sur l'image non réduite est de -32, 0. Chaque étape centre l'alignement autour de la valeur trouvée sur l'image précédante. Cette algorithme est donc une recherche binaire.
Cette technique détecte des coins sur chacune des images à aligner puis leur attribut une signature. En associant les signatures, il est possible de déterminer le déplacement entre chaque élément de la pair.
ORB est une version modifiée de BRIEF qui supporte aussi la détection des rotations.
En faisant la corrélation croisée entre les deux images, une troisième image est obtenue représentant l'erreur avec une directionnalitée. L'avantage de cette technique est qu'elle est supposée être rapide puisqu'elle est basée sur une FFT. Un autre avantage est qu'il est possible d'obtenir un résultat plus précis que le pixel en suréchantillonnant la DFT.
Chacune des canaux des images possèdent des bordures de taille inégales. Le but ici est de détecter automatiquement le mieux possible où couper l'image final. Des compromis doivent être fait étant donné qu'après l'alignement, un bord d'image peut contenir de l'information dans un des canaux et rien dans un autre.
Plusieurs de ces images possèdent un contraste insatisfesant, une balance des blancs incorrect ou une saturation insuffisante. L'objectif est de corrigé automatique ces défaults.
L'entièreté de l'expérience est faite avec Python 3. La librarie numpy est utilisé pour représenté l'image et pour fournir des fonctions hautes performances de calcul mathématique. La librarie Scikit Image est aussi utilisé pour fournir des fonctions propres au traitement d'images.
Les expériences ont lieu sur trois type d'image, les originals en basse résolution compressé jpeg, les originals haute résolution non-compressé et trois photos personnels
Pour les photos personnels, dans chaque cas, trois images sont prises avec un téléphone Sony Xperia Z3 Compact. Celui-ci possède une résolution encore plus grande que celle des images fournies, mais produit beaucoup plus de bruit et moins de contraste. Le canal B est extrait de la première image, le canal G de la deuxième et le canal R de la troisième. La première photo est un sujet humain et donc en plus du mouvement de la caméra, une partie de l'image aussi bouge. La deuxième photo est identique mais sans sujet sur la photo. Cette image possède beaucoup de détails fins et peu de détails grossiers. La dernière photo représente le cas inverse, c'est à dire qu'elle présente plusieurs objets avec des arrêtes bien définies.
ORB fonctionne de la même façon que BRIEF à l'exception qu'il possède son propre détecteur de point d'intérêt (au lieu de Harris).
L'algorithme est entièrement implémenté dans Scikit Image selon le papier suivant: Manuel Guizar-Sicairos, Samuel T. Thurman, and James R. Fienup, “Efficient subpixel image registration algorithms,” Optics Letters 33, 156-158 (2008). Un paramètre permet de suréchantillonner la DFT et ainsi avoir une précision sous l'ordre du pixel.
En commencant de chaque côté, la variance d'un pixel du bord est prise entre les trois canaux. Si elle est très grande ou très petite, il s'agit d'une bordure et l'algorithme continue. Pour éviter qu'une imperfection de l'image arrêt l'algorithme prématurément, la condition est faite sur quatre points. Par exemple pour le côté gauche de l'image, à la première ittération, les points choisis sont ceux situé au tier et au deux tiers de la hauteur sur la première et la deuxième colonne.
La fonction equalize_adapthist de Scikit image est utilisée. Il s'agit de l'algorithme d'égalisation par histogramme vu en classe, mais celui-ci est appliqué séparemment sur plusieurs régions de l'image de façon à fournir un meilleur contraste local.
En général le résultat le plus précis est obtenue avec la technique par pyramide ou par BRIEF. Ce sont aussi les deux techniques les plus rapides. Il est intéressant de voir que même si la technique par pyramide tente de minimiser l'erreur, la corrélation croisée atteint des valeurs plus basses. L'erreur obtenue par la SDC n'est pas très représentative de la qualité de l'image perçue par l'oeil humain puisque la corrélation croisée ne fonctionne visiblement pas dans ce cas d'utilisation. ORB fonctionne, mais produit un résultat généralement de moins bonne qualité que la pyramide et BRIEF. Cela est probablement du au grand nombre de paramètre entrant dans l'algorithme, un travail plus poussé pourrait probablement le rendre aussi performant que BRIEF.
Le découpage automatique fonctionne bien, mais des compromis doivent être faits. Ainsi parfois une bordure demeure car un des canal possède de l'information à cet endroit.
La seule application de equalize_adapthist améliore grandement la rendu des couleurs et le contraste à un point plus que satisfaisant.
Dans la première photo avec sujet, l'algorithme pyramide est celui fonctionnant le mieux. Malgré tout des artéfactes sont présents autour du sujet dû à son mouvement. Dans la deuxième photo identique, mais statique, l'algorithme pyramide est aussi le meilleur. Certains artéfacts sont présents à quelques endroits probablement car la rotation n'est pas corrigé. Dans la troisième image, l'algorithme pyramidale produit le meilleur résultat. BRIEF donne un résultat satisfaisant.
Dans tous les cas, l'algorithme de corrélation croisée fonctionne étragement bien. Je n'ai pas d'hypothèse par rapport à cela.
Temps | Erreur | Translation G | Translation R | ||
---|---|---|---|---|---|
00106v.jpg | |||||
Simple | 33.4 | 241 | 4, 1 | 9, -1 | |
Pyramide | 0.170 | 241 | 4, 1 | 9, -1 | |
Corrélation croisée | 0.954 | 236 | 3.5, -0.5 | 8.9, -1.3 | |
BRIEF | 0.0749 | 240 | 4, 1 | 9, -1 | |
ORB | 0.816 | 240 | 3.6, 1.0 | 9.2, -1.0 | |
00757v.jpg | |||||
Simple | 30.8 | 249 | 2, 3 | 5, 5 | |
Pyramide | 0.176 | 248 | 2, 3 | 5, 5 | |
Corrélation croisée | 0.508 | 235 | 0.7, 0.4 | -111.4, 0.2 | |
BRIEF | 0.0711 | 268 | 1.5, 3.0 | 4.0, 5.0 | |
ORB | 0.981 | 270 | 2.0, 3.0 | 5.0, 5.0 | |
00888v.jpg | |||||
Simple | 32.0 | 184 | 6, 1 | 12, 0 | |
Pyramide | 0.171 | 184 | 6, 1 | 12, 0 | |
Corrélation croisée | 0.279 | 178 | 5.6, -0.1 | 9.7, -0.8 | |
BRIEF | 0.0692 | 184 | 6.0, 1.0 | 13.0, 1.0 | |
ORB | 0.957 | 177 | 5.8, 0.4 | 12.0, 0.0 | |
00889v.jpg | |||||
Simple | 32.2 | 208 | 2, 2 | 4, 3 | |
Pyramide | 0.146 | 208 | 2,2 | 4, 3 | |
Corrélation croisée | 0.563 | 183 | 1.5, -0.6 | 4.8, -1.5 | |
BRIEF | 0.0974 | 218 | 1.0, 3.0 | 4.5, 6.0 | |
ORB | 0.897 | 199 | 1.2, 2.0 | 4.0, 3.0 | |
00907v.jpg | |||||
Simple | 31.7 | 229 | 3, 1 | 7, 28 | |
Pyramide | 0.167 | 201 | 3, 1 | 6, 0 | |
Corrélation croisée | 0.300 | 189 | -0.4, -0.6 | 5.0, -0.9 | |
BRIEF | 0.0702 | 197 | 2.0, 0.0 | 5.0, -1.0 | |
ORB | 0.635 | 194 | 2.4, 0.0 | 6.0, 0.0 | |
00911v.jpg | |||||
Simple | 33.1 | 183 | 1, -1 | 13, -1 | |
Pyramide | 0.145 | 183 | 1, -1 | 31, -1 | |
Corrélation croisée | 0.350 | 182 | 1.7, -1.0 | 6.8, -2.5 | |
BRIEF | 0.0713 | 202 | 6.0, -2.0 | NAN, NAN | |
ORB | 0.895 | 189 | 1.0, 0.0 | 13.0, -1.0 | |
01031v.jpg | |||||
Simple | 33.4 | 170 | 1, 1 | 4, 2 | |
Pyramide | 0.143 | 170 | 1, 1 | 4, 2 | |
Corrélation croisée | 0.511 | 164 | 1.2, 1.1 | 3.8, 1.1 | |
BRIEF | 0.0704 | - | NAN, NAN | NAN, NAN | |
ORB | 0.956 | 178 | 1.1, 2.0 | 4.0, 1.4 | |
01657v.jpg | |||||
Simple | 33.0 | 180 | 5, 1 | 12, 1 | |
Pyramide | 0.176 | 180 | 5, 1 | 12, 1 | |
Corrélation croisée | 0.268 | 168 | 5.7, -0.5 | 12.1, -1.7 | |
BRIEF | 0.0752 | 171 | 5.5, 1.0 | 12.0, 1.0 | |
ORB | 0.741 | 170 | 5.2, 1.0 | 11.5, 1.2 | |
01880v.jpg | |||||
Simple | 31.4 | 209 | 6, 2 | 14, 4 | |
Pyramide | 0.146 | 208 | 6, 2 | 14, 4 | |
Corrélation croisée | 0.275 | 200 | 5.5, 1.7 | 13.3, 3.2 | |
BRIEF | 0.0713 | - | -6.0, 8.0 | 10.0, -4.0 | |
ORB | 0.950 | 257 | 6.0, 2.0 | 14.0, 4.0 | |
00029u.tif | Pyramide | 13.8 | 2081 | 39, 16 | 91, 34 |
Corrélation croisée | 62.5 | 1919 | 77.4, -5.8 | 87.9, -11.7 | |
BRIEF | 13.3 | 2013 | 39.0, 14.0 | 89.5, 38.5 | |
ORB | 55.0 | 2051 | 37.2, 14.2 | 93.1, 43.0 | |
00087u.tif | Pyramide | 13.9 | 2336 | 48, 38 | 108, 55 |
Corrélation croisée | 88.3 | 2038 | 54.2, -0.1 | 102.2, 1.4 | |
BRIEF | 13.2 | 2381 | 48.0, 41.0 | 108.5, 57.5 | |
ORB | 64.3 | 2373 | 48.0, 39.7 | 77.6, 51.6 | |
00128u.tif | Pyramide | 16.1 | 2119 | 35, 25 | 51, 38 |
Corrélation croisée | 45.2 | 1962 | 36.2, 2.0 | 84.8, 3.5 | |
BRIEF | 13.0 | 2193 | 34.5, 24.5 | 54.5, 41.0 | |
ORB | 55.0 | 2161 | 34.8, 22.9 | 49.8, 38.4 | |
00458u.tif | Pyramide | 16.9 | 1865 | 43, 6 | 87, 32 |
Corrélation croisée | 222.6 | 1788 | 110.6, 7.4 | 107.1, 0.9 | |
BRIEF | 14.1 | 1859 | 41.5, 1.5 | 84.0, 28.5 | |
ORB | 55.9 | 1875 | 47.8, 2.7 | 83.0, 28.0 | |
00737u.tif | Pyramide | 15.7 | 1754 | 15, 7 | 49, 14 |
Corrélation croisée | 289.1 | 1700 | 38.0, -1.8 | 49.5, -0.6 | |
BRIEF | 13.2 | - | -16.5, 4.0 | NAN, NAN | |
ORB | 85.7 | 1738 | 14.9, 4.3 | 45.5, 15.0 | |
00822u.tif | Pyramide | 17.3 | 2105 | 57, 25 | 125, 33 |
Corrélation croisée | 48.6 | 2037 | 61.9, 3.0 | 101.2, -4.4 | |
BRIEF | 14.2 | 2262 | 57.0, 24.5 | 124.0, 38.0 | |
ORB | 60.0 | 2261 | 58.0, 22.0 | 116.6, 32.4 | |
00892u.tif | Pyramide | 17.4 | 2097 | 16, 2 | 48, -127 |
Corrélation croisée | 466.7 | 1930 | -15.8, -7.7 | 58.9, -14.9 | |
BRIEF | 32.6 | 1955 | 16.0, 1.0 | 40.5, 4.0 | |
ORB | 97.8 | 1954 | 11.8, 3.4 | 40.0, 42.0 | |
01043u.tif | Pyramide | 30.3 | 1670 | -16, 10 | 11, 17 |
Corrélation croisée | 233.2 | 1658 | -18.0, 2.8 | 48.0, -10.7 | |
BRIEF | 31.2 | 1708 | -11.0, 10.0 | 12.5, 14.5 | |
ORB | 106.7 | 1880 | -12.9, 10.5 | 2.2, 59.8 | |
01047u.tif | Pyramide | 30.8 | 1517 | 24, 20 | 71, 33 |
Corrélation croisée | 744.7 | 1525 | -10.6, 13.6 | 69.4, 28.4 | |
BRIEF | 31.1 | 1649 | 23.0, 18.0 | 70.5, 32.5 | |
ORB | 100.0 | 1656 | 23.2, 21.4 | 70.5, 31.4 | |
00001u.tif | Pyramide | 11.6 | 1724 | 38, 3 | 97, -7 |
Corrélation croisée | 234.6 | 1760 | 37.8, 6.2 | 78.3, 13.5 | |
BRIEF | 11.6 | 1719 | 37.5, 3.0 | 98.0, -5.0 | |
ORB | 49.0 | 1726 | 40.0, 5.0 | 95.1, -4.3 | |
00002u.tif | Pyramide | 13.5 | 1853 | 35, 23 | 97, 22 |
Corrélation croisée | 267.1 | 1740 | 33.2, 2.3 | 93.3, 7.1 | |
BRIEF | 10.9 | 1840 | 34.0, 21.0 | 97.0, 22.0 | |
ORB | 38.8 | 1804 | 33.3, 19.9 | 96.8, 13.9 | |
00003u.tif | Pyramide | 13.2 | 1562 | 25, 7 | 63, 32 |
Corrélation croisée | 255.5 | 1414 | |||
BRIEF | 9.6 | NAN | NAN, NAN | NAN | |
ORB | 31.4 | 1544 | 21.3, 5.5 | 60.5, 31.7 | |
00004u.tif | Pyramide | 13.8 | 1648 | 33, 12 | 84, 40 |
Corrélation croisée | 22.4 | 1457 | 33.1, -5.0 | 80.5, -11.5 | |
BRIEF | 10.5 | NAN | NAN, NAN | NAN, NAN | |
ORB | 31.0 | 1627 | 28.3, 9.6 | 80.6, 38.3 | |
00005u.tif | Pyramide | 13.4 | 1899 | 42, 15 | 102, 4 |
Corrélation croisée | 63.18 | 11796 | 45.3, -4.8 | 93.3, -8.7 | |
BRIEF | 9.6 | 1887 | 42.0, 13.0 | 100.5, 4.0 | |
ORB | 47.3 | 1947 | 41.1, 8.1 | -43.0, 1.0 | |
00006u.tif | Pyramide | 17.0 | 2125 | 24, 43 | 68, 52 |
Corrélation croisée | 144.9 | 1862 | 37.8, -3.9 | 68.3, 2.8 | |
BRIEF | 12.6 | 2116 | 23.0, 39.0 | 67.0, 51.0 | |
ORB | 52.8 | 2224 | 24.9, 39.9 | -34.8, 59.8 | |
00007u.tif | Pyramide | 13.7 | 1891 | 40, 15 | 92, 23 |
Corrélation croisée | 21.5 | 1785 | 28.9, -3.8 | 76.3, -9.4 | |
BRIEF | 10.4 | 1904 | 39.0, 17.0 | 92.0, 23.0 | |
ORB | 47.4 | 1875 | 39.7, 13.6 | 88.0, 20.8 | |
00008u.tif | Pyramide | 13.6 | 1631 | 46, 0 | 100, -1 |
Corrélation croisée | 244.71556 | 13.1, -6.9 | 82.9, -13.0 | ||
BRIEF | 10.3 | 1626 | 44.0, 0.5 | 99.0, -1.0 | |
ORB | 37.0 | 1654 | 48.0, 2.0 | 100.8, -1.2 | |
00009u.tif | Pyramide | 13.3 | 1647 | 38, 10 | 80, 16 |
Corrélation croisée | 161.6 | 1532 | 31.7, 2.1 | 52.1, 3.2 | |
BRIEF | 10.2 | 1652 | 40.0, 9.0 | 80.5, 17.0 | |
ORB | 36.9 | 1622 | 34.8, 7.0 | 80.0, 15.0 | |
00010u.tif | Pyramide | 13.8 | 1890 | 46, -4 | 98, -20 |
Corrélation croisée | 80.6 | 1906 | 45, -3.5 | 82.8, -11.3 | |
BRIEF | 10.7 | NAN | NAN, NAN | NAN, NAN | |
ORB | 40.8 | 1925 | 18.4, -5.9 | 84.34, 9.6 | |
Personnelle 1 | Pyramide | 30.8 | 1517 | ||
Corrélation croisée | 255.5 | 1414 | |||
BRIEF | 31.1 | 1649 | |||
ORB | 100.0 | 1656 | |||
Personnelle 2 | Pyramide | 30.8 | 1517 | ||
Corrélation croisée | 255.5 | 1414 | |||
BRIEF | 31.1 | 1649 | |||
ORB | 100.0 | 1656 | |||
Personnelle 3 | Pyramide | 30.8 | 1517 | ||
Corrélation croisée | 255.5 | 1414 | |||
BRIEF | 31.1 | 1649 | |||
ORB | 100.0 | 1656 |
Les résulats obtenus ne sont pas parfaits et certains problèmes ont été recontrés. D'abord l'algorithme simple est très lent et n'est donc qu'adapté aux petites images. La solution est évidemment d'utiliser un autre algorithme.
L'algorithme pyramidale ne fonctionne pas dans un cas. Cela est probablement dû à sa dépendance envers une méthode de mesure d'erreur. Dans ce cas, la SDC ne donne pas toujours un résultat significatif, il est possible de minimiser l'erreur avec un mauvais alignement. L'utilisation d'un algorithme prenant en compte les textures améliorerait probablement significativement la précision des résultats. Des tests préliminaires ont été fait avec SSIM, mais la vitesse d'exécution beaucoup plus lente rendait impraticable son utilisation.
BRIEF fonctionne généralement bien, sauf le cas de la dernière image où le data association n'est pas bon. Pour résoudre cela, BRIEF possède plusieurs paramètres pouvant être ajustés, mais la véritable solution est probablement d'utiliser un filtre RANSAC robuste pour éliminer les mauvaises données. Aussi, quelques images sont noirs, cela est causé par le fait que dans ces images, un nombre insuffisant de points d'intérêt à été trouvé causant l'échec de l'algorithme et une image erronée. Puis, cette image a été effacée en passant dans l'algorithme de détection de bordure.
ORB est très difficile à ajuster correctement et c'est pour cela que les résultats sont de généralement moins bonne qualité. Un travail plus poussé pourrait sans doute l'amener à être meilleur que les autres solutions tout en supportant l'alignement en rotation.
Pour des raisons citées plus haut, la corrélation croisée n'est pas adéquate pour ce cas d'utilisation et donc tenter de l'améliorer serait futile.
Cette expérience prouve que la recherche de descripteurs est une technique envisageable pour l'alignement de canaux RGB d'une image. L'utilisation de cette technique avec un filtre tel que RANSAC permet d'obtenir un résultat robuste dans plusieurs types d'images. Les nombreux paramètres entrant dans l'algorithme BRIEF signifie que des optimisations subséquantes pourraient améliorer sa vitesse et sa précision à un point dépassant la méthode par pyramide.
L'éxpérience a aussi prouvé que l'utilisation de la corrélation croisée n'est pas utile pour l'alignements des différents canaux. Cela est probablement du au fait que entre deux canaux de larges régions diffèrent en intensité ce qui oriente fortement le gradient obtenu alors que les coins sont semblables dans tous les cas.