TP1 - Photographie algorithmique

L'objectif du présent TP est de créer un programme qui:

  1. Sépare une image représentant les composantes RGB en trois
  2. Aligne les trois composantes
  3. Combine les composantes pour en faire une image couleur

Quelques approches seront explorées

Deux autres améliorations automatiques aussi sont testées, soit:

Description des techniques

Force brute à échelle simple

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)

Force brute à échelle multiple

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.

BRIEF

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

ORB est une version modifiée de BRIEF qui supporte aussi la détection des rotations.

Corrélation croisée

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.

Recadrage automatique

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.

Amélioration des contrastes et de la balance des couleurs automatique

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.

Implémentation

Logiciels utilisés

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.

Dataset

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.

Méthode simple

  1. L'image est découpée en ses trois composantes
  2. Le canal vert est superposé sur le bleu
  3. L'image est coupée de chaque côté de 10%
  4. La SDC est calculée
  5. Le canal vert est décalé de 1px et l'étape 1 est recommencée
  6. L'opération est répétée pour tous les décalages possible de +/- 30 px de haut en bas et de gauche à droite
  7. L'opération est répétée pour le canal rouge

Méthode par pyramide

  1. L'image est découpée en ses trois composantes
  2. Le canal vert est superposé sur le bleu
  3. L'image est rapetissée d'un facteur deux jusqu'à atteindre 2^12 pixels
  4. L'image est coupée de chaque côté de 10%
  5. La SDC est calculée
  6. Le canal vert est décalé de 1px et l'étape 1 est recommencée
  7. L'opération est répétée pour tous les décalages possible de +/- 1 px de haut en bas et de gauche à droite
  8. L'opération est recommencée pour l'image immédiatement plus grande en la centrant autour des valeurs précédantes trouvée multipliée par deux tant que l'image de taille originale n'est pas obtenue
  9. L'opération est répétée pour le canal rouge

BRIEF

  1. L'image est découpée en ses trois composantes
  2. Les canaux bleu et vert sont coupés de chaque côté de 10%
  3. Le détecteur de coin Harris est appliquée sur ces canaux
  4. BRIEF est appliqué sur chaque coin pour leur attribuer une signature
  5. Les descripteurs des deux canaux sont associés en pair
  6. Un vecteur de déplacement est calculé
  7. Les cas de déplacement extrèmes sont filtrés
  8. Un filtre de RANSAC ou médianne détermine la bonne valeur
  9. L'opération est répétée pour le canal rouge

ORB

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).

Corrélation croisée

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.

Recadrage automatique

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.

Amélioration des contrastes et de la balance des couleurs automatique

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.

Résultats

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.

Résultats sur photo personnelles

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.

244.7
TempsErreurTranslation GTranslation R
00106v.jpg
Simple33.42414, 19, -1
Pyramide0.1702414, 19, -1
Corrélation croisée0.9542363.5, -0.58.9, -1.3
BRIEF0.07492404, 19, -1
ORB0.8162403.6, 1.09.2, -1.0
00757v.jpg
Simple30.82492, 35, 5
Pyramide0.1762482, 35, 5
Corrélation croisée0.5082350.7, 0.4-111.4, 0.2
BRIEF0.07112681.5, 3.04.0, 5.0
ORB0.9812702.0, 3.05.0, 5.0
00888v.jpg
Simple32.01846, 112, 0
Pyramide0.1711846, 112, 0
Corrélation croisée0.2791785.6, -0.19.7, -0.8
BRIEF0.06921846.0, 1.013.0, 1.0
ORB0.9571775.8, 0.412.0, 0.0
00889v.jpg
Simple32.22082, 24, 3
Pyramide0.1462082,2 4, 3
Corrélation croisée0.5631831.5, -0.64.8, -1.5
BRIEF0.09742181.0, 3.04.5, 6.0
ORB0.8971991.2, 2.04.0, 3.0
00907v.jpg
Simple31.72293, 17, 28
Pyramide0.1672013, 16, 0
Corrélation croisée0.300189-0.4, -0.65.0, -0.9
BRIEF0.07021972.0, 0.05.0, -1.0
ORB0.6351942.4, 0.06.0, 0.0
00911v.jpg
Simple33.11831, -113, -1
Pyramide0.1451831, -131, -1
Corrélation croisée0.3501821.7, -1.06.8, -2.5
BRIEF0.07132026.0, -2.0NAN, NAN
ORB0.8951891.0, 0.013.0, -1.0
01031v.jpg
Simple33.41701, 14, 2
Pyramide0.1431701, 14, 2
Corrélation croisée0.5111641.2, 1.13.8, 1.1
BRIEF0.0704-NAN, NANNAN, NAN
ORB0.9561781.1, 2.04.0, 1.4
01657v.jpg
Simple33.01805, 112, 1
Pyramide0.1761805, 112, 1
Corrélation croisée0.2681685.7, -0.512.1, -1.7
BRIEF0.07521715.5, 1.012.0, 1.0
ORB0.7411705.2, 1.011.5, 1.2
01880v.jpg
Simple31.42096, 214, 4
Pyramide0.1462086, 214, 4
Corrélation croisée0.2752005.5, 1.713.3, 3.2
BRIEF0.0713--6.0, 8.010.0, -4.0
ORB0.9502576.0, 2.014.0, 4.0
00029u.tifPyramide13.8208139, 1691, 34
Corrélation croisée62.5191977.4, -5.887.9, -11.7
BRIEF13.3201339.0, 14.089.5, 38.5
ORB55.0205137.2, 14.293.1, 43.0
00087u.tifPyramide13.9233648, 38108, 55
Corrélation croisée88.3203854.2, -0.1102.2, 1.4
BRIEF13.2238148.0, 41.0108.5, 57.5
ORB64.3237348.0, 39.777.6, 51.6
00128u.tifPyramide16.1211935, 2551, 38
Corrélation croisée45.2196236.2, 2.084.8, 3.5
BRIEF13.0219334.5, 24.554.5, 41.0
ORB55.0216134.8, 22.949.8, 38.4
00458u.tifPyramide16.9186543, 687, 32
Corrélation croisée222.61788110.6, 7.4107.1, 0.9
BRIEF14.1185941.5, 1.584.0, 28.5
ORB55.9187547.8, 2.783.0, 28.0
00737u.tifPyramide15.7175415, 749, 14
Corrélation croisée289.1170038.0, -1.849.5, -0.6
BRIEF13.2--16.5, 4.0NAN, NAN
ORB85.7173814.9, 4.345.5, 15.0
00822u.tifPyramide17.3210557, 25125, 33
Corrélation croisée48.6203761.9, 3.0101.2, -4.4
BRIEF14.2226257.0, 24.5124.0, 38.0
ORB60.0226158.0, 22.0116.6, 32.4
00892u.tifPyramide17.4209716, 248, -127
Corrélation croisée466.71930-15.8, -7.758.9, -14.9
BRIEF32.6195516.0, 1.040.5, 4.0
ORB97.8195411.8, 3.440.0, 42.0
01043u.tifPyramide30.31670-16, 1011, 17
Corrélation croisée233.21658-18.0, 2.848.0, -10.7
BRIEF31.21708-11.0, 10.012.5, 14.5
ORB106.71880-12.9, 10.52.2, 59.8
01047u.tifPyramide30.8151724, 2071, 33
Corrélation croisée744.71525-10.6, 13.669.4, 28.4
BRIEF31.1164923.0, 18.070.5, 32.5
ORB100.0165623.2, 21.470.5, 31.4
00001u.tifPyramide11.6172438, 397, -7
Corrélation croisée234.6176037.8, 6.278.3, 13.5
BRIEF11.6171937.5, 3.098.0, -5.0
ORB49.0172640.0, 5.095.1, -4.3
00002u.tifPyramide13.5185335, 2397, 22
Corrélation croisée267.1174033.2, 2.393.3, 7.1
BRIEF10.9184034.0, 21.097.0, 22.0
ORB38.8180433.3, 19.996.8, 13.9
00003u.tifPyramide13.2156225, 763, 32
Corrélation croisée255.51414
BRIEF9.6NANNAN, NANNAN
ORB31.4154421.3, 5.560.5, 31.7
00004u.tifPyramide13.8164833, 1284, 40
Corrélation croisée22.4145733.1, -5.080.5, -11.5
BRIEF10.5NANNAN, NANNAN, NAN
ORB31.0162728.3, 9.680.6, 38.3
00005u.tifPyramide13.4189942, 15102, 4
Corrélation croisée63.181179645.3, -4.893.3, -8.7
BRIEF9.6188742.0, 13.0100.5, 4.0
ORB47.3194741.1, 8.1-43.0, 1.0
00006u.tifPyramide17.0212524, 4368, 52
Corrélation croisée144.9186237.8, -3.968.3, 2.8
BRIEF12.6211623.0, 39.067.0, 51.0
ORB52.8222424.9, 39.9-34.8, 59.8
00007u.tifPyramide13.7189140, 1592, 23
Corrélation croisée21.5178528.9, -3.876.3, -9.4
BRIEF10.4190439.0, 17.092.0, 23.0
ORB47.4187539.7, 13.688.0, 20.8
00008u.tifPyramide13.6163146, 0100, -1
Corrélation croisée155613.1, -6.982.9, -13.0
BRIEF10.3162644.0, 0.599.0, -1.0
ORB37.0165448.0, 2.0100.8, -1.2
00009u.tifPyramide13.3164738, 1080, 16
Corrélation croisée161.6153231.7, 2.152.1, 3.2
BRIEF10.2165240.0, 9.080.5, 17.0
ORB36.9162234.8, 7.080.0, 15.0
00010u.tifPyramide13.8189046, -498, -20
Corrélation croisée80.6190645, -3.582.8, -11.3
BRIEF10.7NANNAN, NANNAN, NAN
ORB40.8192518.4, -5.984.34, 9.6
Personnelle 1Pyramide30.81517
Corrélation croisée255.51414
BRIEF31.11649
ORB100.01656
Personnelle 2Pyramide30.81517
Corrélation croisée255.51414
BRIEF31.11649
ORB100.01656
Personnelle 3Pyramide30.81517
Corrélation croisée255.51414
BRIEF31.11649
ORB100.01656

Amélioration possible

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.

Conclusion

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.

Annexe

Résultat du recadrage automatique et de la correction par histogramme

Originale avec la méthode par pyramide
Recadrée et corrigée automatiquement
Original
Recadrée
Original
Recadrée
Original
Recadrée
Original
Recadrée
Original
Recadrée
Original
Recadrée
Original
Recadrée
Original
Recadrée
Original
Recadrée
Original
Recadrée
Original
Recadrée
Original
Recadrée
Original
Recadrée
Original
Recadrée
Original
Recadrée
Original
Recadrée
Original
Recadrée
Original
Recadrée
systsemcot

Résultats final de l'alignement automatique

Cest images comprennent aussi l'élimination des bordures et la correction par histogramme.
Pyramid
BRIEF
ORB
CrossCorrelation
Pyramid
Brief
Orb
CrossCorrelation
Pyramid
Brief
Orb
CrossCorrelation
Pyramid
Brief
Orb
CrossCorrelation
Pyramid
Brief
Orb
CrossCorrelation
Pyramid
Brief
Orb
CrossCorrelation
Pyramid
Brief
Orb
CrossCorrelation
Pyramid
Brief
Orb
CrossCorrelation
Pyramid
Brief
Orb
CrossCorrelation
Pyramid
Brief
Orb
CrossCorrelation
Pyramid
Brief
Orb
CrossCorrelation
Pyramid
Brief
Orb
CrossCorrelation
Pyramid
Brief
Orb
CrossCorrelation
Pyramid
Brief
Orb
CrossCorrelation
Pyramid
Brief
Orb
CrossCorrelation
Pyramid
Brief
Orb
CrossCorrelation
Pyramid
Brief
Orb
CrossCorrelation
Pyramid
Brief
Orb
CrossCorrelation
Pyramid
Brief
Orb
CrossCorrelation
Pyramid
Brief
Orb
CrossCorrelation
Pyramid
Brief
Orb
CrossCorrelation
Pyramid
Brief
Orb
CrossCorrelation
Pyramid
Brief
Orb
CrossCorrelation
Pyramid
Brief
Orb
CrossCorrelation
Pyramid
Brief
Orb
CrossCorrelation
Pyramid
Brief
Orb
CrossCorrelation
Pyramid
Brief
Orb
CrossCorrelation
Pyramid
Brief
Orb
CrossCorrelation
Pyramid
Brief
Orb
CrossCorrelation
Pyramid
Brief
Orb
CrossCorrelation
Pyramid
Brief
Orb
CrossCorrelation
Pyramid
Brief
Orb
CrossCorrelation