2. Dématriçage par interpolation bilinéaire

<< Image CFA | Liste des exercices | Dématriçage basé sur l'estimation locale d'un gradient >>

Présentation

L'algorithme de dématriçage par interpolation bilinéaire procède par une interpolation linéaire des valeurs disponibles, composante par composante, et dans les deux directions du plan image (d'où la dénomination bilinéaire). Les formules d'interpolation figurent dans le support du cours correspondant à ce TP.

Ce dématriçage est réalisable par convolution en considérant les plans $\phi^k$, $k \in \{R,G,B\}$, respectivement définis par les seuls niveaux où la composante $k$ est disponible dans l'image CFA (les autres niveaux étant fixés à 0) :

   
$\phi^R$   $\phi^G$   $\phi^B$

si le CFA est le suivant (seul CFA considéré dans la suite des exercices) :

Pour réaliser le dématriçage, chacun des plans $\phi^k$ doit être respectivement filtré par convolution avec les masques suivants :

$H^R=H^B=\frac{1}{4}\left[\begin{array}{ccc} 1 & 2 & 1 \\ 2 & 4 & 2 \\ 1 & 2 & 1\end{array}\right]$ et $H^G=\frac{1}{4}\left[\begin{array}{rrr} 0 & 1 & 0 \\ 1 & 4 & 1 \\ 0 & 1 & 0 \end{array}\right]$.

  1. Expliquer pourquoi (et comment) ces masques de convolution permettent bien de retrouver les formules de dématriçage par interpolation bilinéaire vues en cours.

Programmation du dématriçage

  1. Sur le modèle du plugin écrit au premier exercice, écrire les méthodes setup et run d'un nouveau plugin sample_cfa.java qui, à partir d'une image CFA en niveaux de gris sur 8 bits, génère les 3 plans $\phi^k$ sous la forme de 3 images également sur 8 bits :
   
$\phi^R$   $\phi^G$   $\phi^B$
Ces 3 images seront stockées dans une fenêtre unique, sous la forme d'une pile d'images (classe ImageStack), grâce au code suivant à intégrer dans la méthode run :
// Calcul des échantillons de chaque composante de l'image CFA
ImageStack samples_stack = imp.createEmptyStack();
samples_stack.addSlice("rouge", cfa_samples(ip,0));	// Composante R
samples_stack.addSlice("vert", cfa_samples(ip,1));// Composante G
samples_stack.addSlice("bleu", cfa_samples(ip,2));	// Composante B

// Création de l'image résultat
ImagePlus cfa_samples_imp = imp.createImagePlus();
cfa_samples_imp.setStack("Échantillons couleur CFA", samples_stack);
  1. En vous inspirant de la méthode cfa du premier exercice, écrire la méthode
ImageProcessor cfa_samples(ImageProcessor cfa_ip, int k)
qui retourne, à partir d'une image CFA cfa_ip, l'image en niveaux de gris sur 8 bits (instance de ByteProcessor) correspondant au plan $\phi^k$ ($\phi^R$ pour $k=0$, $\phi^G$ pour $k=1$, et $\phi^B$ pour $k=2$).
  1. Écrire une macro ImageJ demat_bilin.txt qui, partant d'une image CFA,
    1. appelle le plugin sample_cfa pour générer les plans $\phi^k$ dans une pile ;
    2. réalise la convolution de chacun de ces plans $\phi^k$ par son masque respectif $H^k$ (cf. menu Process/Filters/Convolve...), en veillant à ne pas normaliser le masque (les coefficients devront donc être saisis sous forme de nombres réels) ;
    3. combine les 3 plans filtrés de la pile dans une image couleur unique (cf. menu Image/Color/Stack to RGB) pour former l'image estimée par interpolation bilinéaire :