l'image de fond

fr       en

Traitements en Niveau de Gris

L'Interpolation

Il arrive, dans certain cas, qu'on est besoin d'ajouter des pixels entre les pixels existant d'une image. Nous allons prendre l'exemple d'un zoom. Sur une image de 10x10 pixels que nous devons agrandir de deux fois en ligne et deux fois en colonne, donc l'image finale sera 4 fois plus grande que l'image d'origine. L'image finale aura donc 20x20 pixels. Regardez le premier exemple, les pixels qui doivent être ajoutés sont représentés en noir . Nous voyons la nécessité de pouvoir créer des pixels. Mais nous n'allons pas créer les pixels au hasard. Nous allons voir deux types d'interpolation.

Nearest-neighbor

Il s'agit ici de la plus simple interpolation possible. Nous remplissons les nouveaux pixels par la valeur du pixel le plus proche. Exemple, le pixel en haut à gauche p(1,1) sera associé aux nouveaux pixels p(2,1), p(1,2) et p(2,2). Nous voyons le résultat sur le premier exemple au milieu.

bilinéaire

Cette interpolation est un peu plus complexe mais elle offre de bien meilleurs résultats. Ici nous n'allons pas utiliser 1 pixel pour déterminer les nouveaux, mais plusieurs. Prenons en exemple l'image suivante :
interpolation3
afin de calculer les nouveaux pixels n nous allons faire la moyenne des pixels les plus proches.
si il y a deux voisins :


interpolationbilineaire1

interpolationbilineaire2

interpolationbilineaire3

interpolationbilineaire4


si il y a quatre voisins :

interpolationbilineaire5

L'opération doit être réitérée pour toute l'image. Nous pouvons voir un résultat sur le premier exemple à droite.

Le programme

function guitranslation
clear all;
close all;
figure(  'name','interpolation',...
            'NumberTitle','off',...
            'color',[0.3137 0.3137 0.5098]);
       
a(1)=axes('units','normalized',...
    'position',[0.2 0.4 0.2 0.2]);
a(2)=axes('units','normalized',...
    'position',[0.5 0.4 0.4 0.4]);


uicontrol(  'style','pushbutton',...
            'string','load',...
            'Position', [10 10 50 20],...
            'callback',@loadimage);
uicontrol(  'style','pushbutton',...
            'string','nearest',...
            'Position', [100 10 50 20],...
            'callback',@nearest);
uicontrol(  'style','pushbutton',...
            'string','bilineaire',...
            'Position', [200 10 50 20],...
            'callback',@bilineaire);


%parametre initial
setappdata(gcf,'n',10);
setappdata(gcf,'x',1);
setappdata(gcf,'degree',0);
     
function loadimage(~,~)
    % appeler quand appui check box
    n = getappdata(1,'n');
    p=0;
    x=uint8(zeros(n+1));
    for i = 1 : n+1
        for j = 1 : n+1
            p = 255*j/(2*n)+255*i/(2*n);
            x(i,j)=p;
        end
    end
   
    k=8;
   
    setappdata(1,'x',x);
    axes(a(1))
    imshow(x)
    img=uint8(zeros(2*n));
    for i = 1: n
        for j = 1 : n
            img(2*(i-1)+1,2*(j-1)+1)= x(i,j);
            img(2*(i-1)+2,2*(j-1)+1)= 0;
            img(2*(i-1)+1,2*(j-1)+2)= 0;
            img(2*(i-1)+2,2*(j-1)+2)= 0;
        end
    end
   
    axes(a(2))
    imshow(img)
   
end
function bilineaire(hObj,~)

     x = getappdata(1,'x');
     x=uint16(x);
     n = getappdata(1,'n');
     img=uint16(zeros(2*n));
     for i = 1: n
        for j = 1 : n
            img(2*(i-1)+1,2*(j-1)+1)= x(i,j);
            img(2*(i-1)+2,2*(j-1)+1)= (x(i,j)+x(i+1,j))/2;
            img(2*(i-1)+1,2*(j-1)+2)= (x(i,j)+x(i,j+1))/2;
            img(2*(i-1)+2,2*(j-1)+2)= (x(i,j)+x(i+1,j)+x(i,j+1)+x(i+1,j+1))/4;
        end
    end
   img=uint8(img);
    axes(a(2))
    imshow(img)
     
end
function nearest(hObj,~)

     x = getappdata(1,'x');
     n = getappdata(1,'n');
     img=uint8(zeros(2*n));
     for i = 1: n
        for j = 1 : n
            img(2*(i-1)+1,2*(j-1)+1)= x(i,j);
            img(2*(i-1)+2,2*(j-1)+1)= x(i,j);
            img(2*(i-1)+1,2*(j-1)+2)= x(i,j);
            img(2*(i-1)+2,2*(j-1)+2)= x(i,j);
        end
    end
   
    axes(a(2))
    imshow(img)
     
end
end

exemple

A gauche l'image agrandie avec les nouveaux pixels en noir, au milieu une interpolation au plus proche et à droite l'interpolation bilinéaire

interpolation d'une image nearest et bilinéaire
Et avec une image réelle. En haut à droite interpolation nearest et en bas à droite interpolation bilinéaire

interpolation d'une image nearest et bilinéaire

Copyright © 2010-2014, tous droits réservés, contact : operationpixel@free.fr