我有一个灰度图像,需要提高其分辨率。如何在MATLAB中完成?它主要是通过乘以图像的尺寸来完成的吗?
答案 0 :(得分: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)
)。
关于边缘处理,请参阅interp2
的文档以获取有关extrapval
参数的信息。代码变得丑陋,但您可以修补插值点(interp2
输入)中的最小/最大元素以简单地映射到边缘,或者可以NaN
用于extrapval
和后期处理imres
将NaN
替换为邻居等。请注意,只需在linspace(1,size(I,1),rows)
等点进行插值,就不会给出预期规模变化。
答案 1 :(得分:1)
您还可以通过对图像进行傅里叶变换,对其进行零填充,对其进行傅里叶逆变换以及获取绝对值来执行正弦插值。
im_rz = abs(ifft2(padarray(fft2(im),[row_pad, col_pad])))
答案 2 :(得分:0)
你可以&#34;幻觉&#34;高分辨率细节。参见例如Glasner等"Single image Super resolution" ICCV 2009。
可以找到该算法的实现here