Ce travail consiste à recréer une image couleur à partir des 3 canaux séparés de cette image. Pour ce faire, il faut d'abord cadrer les images des 3 canaux puis trouver un alignement optimal afin de ne pas avoir d'effet de "ghosting" dans le résultat final. Afin de garder le tout le plus simple possible, la seule transformation géométrique effectuée sera la translation, même si celle-ci est insuffisante afin d'avoir un alignement parfait entre les 3 canaux. L'algorithme utilisé afin de trouver cette translation optimale est le point d'intérêt de ce travail. Différentes tactiques sont testées et les résultats sont présentées dans chaque cas.
L'image en entrée est d'abord séparée en 3 images égales de haut en bas. L'image du haut (bleu) sert de référence spatiale. Chaque image est ensuite "crop" de façon à éliminer les bordures. Pour les canaux rouge et vert, une série de translation entre +15 et -15 pixels en X et en Y sont calculées par force brute (15^2 translations calculées). Chaque résultat de translation est ensuite comparé par SDC au canal de référence. La translation pour chaque canal avec le meilleur score est conservée. Les images originales des canaux se font ensuite appliquer les translations gagnantes avant d'être rassemblées dans une même image couleur. Comme on peut le constater dans les résultats suivants, cette méthode ne s'est pas avérée très efficace dans mes tests. Je crois que l'une des raison est qu'il n'y a pas vraiment de lien entre l'intensité d'un certain pixel dans un canal et l'intensité de ce même pixel dans un autre canal. Par exemple, si on fait la SDC entre le canal bleu d'une image quelconque et une image complètement grise (à 128/256), on risque d'avoir un score similaire voir meilleur qui si on fait la SDC avec le canal vert de la première image. Ainsi, j'ai décidé de faire l'ajout d'un prétraitement des canaux des images avant de faire la SDC dans la section suivante.
Cette fois-ci, avant d'évaluer les paires d'images avec la SDC, les images sont filtrées binairement avec l'algorithme suivant:
Calcule la carte des gradient en X et en Y pour l'image
Le résultat est une image binaire qui est insensible au niveau global de luminosité et qui représente les zones de changement d'intensité (gradient), ce qui va rendre le score de la SDC plus représentatif des différences réelles entre les images. D'un canal à l'autre, les gradients sont sensiblement les mêmes et aux même endroits. Les résultats montrent un alignement presque parfait dans tous les cas testés.
*La partie crédit supplémentaire est l'utilisation de mon algorithme décrit ci-haut en prétraitement à la SDC
Pour le traitement d'images haute résolution, la méthode utilisée précédament est beaucoup trop lente car la plage de valeur à essayer par force brute augmente en n^2. C'est pourquoi ici la recherche de la translation idéale est divisée en plusieurs échelles (1, 1/2, 1/4...). Pour chaque échelle, on recherche la translation idéale en tenant compte de la translation idéale de l'échelle précédante. Au final, il suffit de faire la somme de toutes les translations multipliées par leur échelle respective. Pour le prétraitement binaire, j'utilise ici un détecteur d'arrête (Canny) déjà implémenté dans OpenCV qui est beaucoup plus rapide que mon algorithme de la section précédante (échelle unique). Le détecteur Canny détecte les gradiants dans l'images, ce qui va permettre de comparer par force brute seulement les arêtes des images avec la SDC. Les résultats montrent un alignement presque parfait dans tous les cas testés.