Mintavételezés Matlabban
A mintavételezésre nincs külön függvény Matlabban, egy trükkhöz kell folyamodnunk. Használjuk a meshgrid() függvényt, amellyel tetszőleges méretű egyenletesen mintavételezett hálót generálunk a régi képhez és az új képhez is. A meshgrid() függvény a háló csomópontjainak koordinátáit adja vissza egy-egy mátrixban.
>> [X,Y] = meshgrid(1:3,10:14)
X = 1 2 3
1 2 3
1 2 3
1 2 3
1 2 3
Y = 10 10 10
11 11 11
12 12 12
13 13 13
14 14 14
Hozzunk létre egy mátrixot az eredeti kép méretével, majd hozzunk létre egy másik mátrixot az új, mintavételezett kép méretével. Ezt követően használjunk egy 2-dimenziós interpolációs módszert a két háló pontjai között úgy, hogy az új kép intenzitásai az eredeti kép intenzitásai alapján lesznek meghatározva (az interpoláció alapján). Az interpolációt a két háló között az interp2() függvény hozza létre.
Az itt bemutatott módszer Omer Demirkaya megoldásának egy változata:
function nimg = myimresample(img, newresXY, interpolation)
% newresXY is a vector of the rowsize and columnsize
imgd = im2double(img); % convert intensities into [0;1]
[r,c,z] = size(img);
r=r-1;
c=c-1;
ops=[1, 1]; % old pixel size
resample_factor = [r / newresXY(1) , c / newresXY(2) ];
nps=ops .* resample_factor % new pixel size
old_center = ops/2;
new_center = nps / 2;
[Ox,Oy] = meshgrid(old_center(1):ops(1):c*ops(1)+old_center(1), old_center(2):ops(2):r*ops(2)+old_center(2));
[Nx,Ny] = meshgrid(new_center(1):nps(1):c*ops(1)+new_center(1), new_center(2):nps(2):r*ops(2)+new_center(2));
for i=1:z
nimg(:,:,i) = interp2(Ox,Oy,imgd(:,:,i),Nx,Ny,interpolation);
end;
imshow(nimg);
end
Próbáljuk ki a függvényt a kormany_320x213.jpg képre!
>> img = imread('kormany_320x213.jpg');
>> nimg_a = myimresample(img, [107,160], 'nearest');
>> nimg_b = myimresample(img, [107,160], 'linear');
>> nimg_c = myimresample(img, [107,160], 'pchip'); % Octave-ban, Matlabban 'cubic'
>> nimg_d = myimresample(img, [107,160], 'spline');
Legközelebbi szomszéd | Lineáris |
Köbös Hermit interpoláció | Spline |