【发布时间】:2013-11-29 07:46:35
【问题描述】:
我有一张灰度图像,需要提高其分辨率。如何在 MATLAB 中做到这一点?例如,主要是通过乘以图像的尺寸来完成吗?
【问题讨论】:
标签: matlab resize image-manipulation
我有一张灰度图像,需要提高其分辨率。如何在 MATLAB 中做到这一点?例如,主要是通过乘以图像的尺寸来完成吗?
【问题讨论】:
标签: matlab resize image-manipulation
您可以“产生幻觉”高分辨率细节。例如,请参阅 Glasner 等人 "Single image Super resolution" ICCV 2009。
该算法的实现可以在here找到
【讨论】:
您还可以通过对图像进行傅里叶变换、补零、傅里叶逆变换以及取绝对值来执行 sinc 插值。
im_rz = abs(ifft2(padarray(fft2(im),[row_pad, col_pad])))
【讨论】:
您需要执行插值。有很多方法可以做到这一点。使用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))时的结果相同。
关于边缘处理,请参阅interp2 的文档以获取有关extrapval 参数的信息。代码变得丑陋,但是您可以修补插值点(interp2 输入)中的最小/最大元素以简单地映射到边缘,或者您可以使用NaN 来处理extrapval,并后处理@ 987654333@ 将NaNs 替换为其邻居等。请注意,简单地在linspace(1,size(I,1),rows) 等点进行插值不会给出预期的比例变化。
【讨论】: