2013-11-15 49 views

回答

2

您需要執行插值。有很多方法可以做到這一點。使用imresize(例如imgOut=imresize(img,scale,method);),或者如果你沒有圖像處理工具箱,考慮下面的代碼:

function imres = resizeim(I,outsize,interpalg) 

if nargin<3 || isempty(interpalg), 
    interpalg='cubic'; 
end 

rows=outsize(1); 
cols=outsize(2); 

vscale = size(I,1)/rows; 
hscale = size(I,2)/cols; 

imgClass = class(I); 
imres = interp2(double(I), (1:cols)*hscale + 0.5 * (1 - hscale), ... 
        (1:rows)'*vscale + 0.5 * (1 - vscale), ... 
        interpalg); 
imres = cast(imres,imgClass); 

注:這是在艱難中起步。許多人需要執行預過濾或其他轉換。此外,此示例僅支持2D(灰度)圖像。對於RGB,可以對其進行調整以處理每個顏色平面,或者簡單地對每個平面進行循環處理。再次,這只是一個例子。

除邊緣處理外,這與關閉抗鋸齒的imresize(即imresize(...,'Antialiasing',false))的結果相同。

關於邊緣處理,有關extrapval參數的信息,請參閱interp2的文檔。代碼變得很難看,但是您可以修補插值點(interp2輸入)中的最小/最大元素以簡單地精確映射到邊緣,或者您可以使用NaN代替extrapval,並且可以使用imres代替NaN其鄰居等等。請注意,只需插入諸如linspace(1,size(I,1),rows)之類的點將不會給帶來預期的比例變化。

1

您還可以通過對圖像進行傅里葉變換,對其進行零填充,傅立葉逆變換並獲取絕對值,從而執行正弦插值。

im_rz = abs(ifft2(padarray(fft2(im),[row_pad, col_pad])))