2013-11-15 97 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])))