圖像放縮
算法分析
- 根據放縮倍數,開辟一個新矩陣存放放縮后的圖像
- 利用雙線性插值公式, 計算新圖像中的每個點映射回原圖像中的灰度值(注意邊界處理)
雙線性插值代碼
function outputimg = my_imresize(A,n)
% A 是圖像矩陣,n是放縮的倍數
% 返回值outputimg是一個放縮后的圖像矩陣
if n <= 0
error('縮放倍數n的值應該大於0!');
end
%四舍五入計算放大后圖像矩陣
[H,W,CH] = size(A);
DH = round(H * n);
DW = round(W * n);
outputimg = zeros(DH,DW,CH);
%利用雙線性插值公式,從新矩陣映射回原圖像
for di = 1:DH
for dj = 1:DW
ii = di / n;jj = dj / n;
i = floor(ii);j = floor(jj);
u = ii - i;v = jj - j;
i = i + 1;j = j + 1;
%邊界處理
if (i < 1)
i = 1;
end
if (j < 1)
j = 1;
end
if((i + 1) > H)
i = H - 1;
end
if((j + 1) > W);
j = W -1;
end
%線性插值公式
outputimg(di,dj,:) = (1 - u) * (1 - v) * A(i,j,:) + (1 - u) * v * A(i,j + 1,:)
+ u * (1 - v) * A(i + 1,j,:) + u * v * A(i + 1,j + 1,:);
end
end
%轉化成uint8才能正常顯示
outputimg = uint8(outputimg);
實驗結果
灰度圖放大2倍
%調用示例:
A = imread('cameraman.tif');
B = my_imresize(A,2);
figure,imshow(A),title('原圖');
figure,imshow(B),title('放大兩倍后的圖像');

彩色圖縮小1/2
% 調用示例:
A = imread('pears.png');
B = my_imresize(A,0.5);
figure,imshow(A),title('原圖');
figure,imshow(B),title('縮小1/2后的圖像');

實驗分析
-
計算新的圖像在原圖上對應的位置,而不是原圖對應到新圖的位置
-
為這些位置賦相應的灰度值,考慮求得的位置是整數或者不是整數。原圖像中只有整數點坐標的像素值,但是放縮后的圖像的坐標包含小數,像(66.7,66.7)這個位置在原圖像中是不存在的,這時候可以采用插值來給這個位置賦值,所以實際是將放大后的圖像矩陣,壓縮到原圖中找到值
-
對邊界越界的處理,當超過邊界的坐標都變成邊界坐標
-
輸出要記得將數據類型改為uint8
-
彩色圖像可以看成三張單通道的灰度圖的組合,每一個通道都和灰度圖像的放縮同樣處理,在Matlab中可以直接用以下形式:A(i,j,:) 處理
