增加灰度图像的分辨率
答
您需要执行插值。有很多方法可以做到这一点。使用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)
之类的点将不会给带来预期的比例变化。
答
您还可以通过对图像进行傅里叶变换,对其进行零填充,傅立叶逆变换并获取绝对值,从而执行正弦插值。
im_rz = abs(ifft2(padarray(fft2(im),[row_pad, col_pad])))