Il arrive, dans certains cas, qu'on est besoin d'ajouter des pixels entre les pixels 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.
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.
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 :
afin de calculer les nouveaux pixels n nous allons faire la moyenne des pixels les plus proches.
s'il y a deux voisins :
s'il y a quatre voisins :
L'opération doit être réitérée pour toute l'image. Nous pouvons voir un résultat sur le premier exemple à droite.
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
À gauche l'image agrandie avec les nouveaux pixels en noir, au milieu une interpolation au plus proche et à droite
l'interpolation bilinéaire
Et avec une image réelle. En haut à droite interpolation nearest et en bas à droite interpolation bilinéaire
Copyright © 2010-2014, tous droits réservés, contact : operationpixel@free.fr