Matlab實現imresize函式功能
阿新 • • 發佈:2020-11-03
影象放縮
演算法分析
- 根據放縮倍數,開闢一個新矩陣存放放縮後的影象
- 利用雙線性插值公式, 計算新影象中的每個點映射回原影象中的灰度值(注意邊界處理)
雙線性插值程式碼
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,:) 處理