我正在尝试编写自己的函数,以使用最近邻插值算法按比例放大输入图像。不好的部分是我能够看到它是如何工作的,但是找不到算法本身。我将不胜感激。

这是我尝试将输入图像放大2倍的方法:

function output = nearest(input)
[x,y]=size(input);
output = repmat(uint8(0),x*2,y*2);
[newwidth,newheight]=size(output);
for i=1:y
    for j=1:x
        xloc = round ((j * (newwidth+1)) / (x+1));
        yloc = round ((i * (newheight+1)) / (y+1));
        output(xloc,yloc) = input(j,i);
    end
end

这是Mark建议后的输出

最佳答案

不久前,我浏览了 imresize MATLAB Image Processing Toolbox函数的代码,以创建用于图像的最近邻居插值的简化版本。这是如何将其应用于您的问题的:

%# Initializations:

scale = [2 2];              %# The resolution scale factors: [rows columns]
oldSize = size(inputImage);                   %# Get the size of your image
newSize = max(floor(scale.*oldSize(1:2)),1);  %# Compute the new image size

%# Compute an upsampled set of indices:

rowIndex = min(round(((1:newSize(1))-0.5)./scale(1)+0.5),oldSize(1));
colIndex = min(round(((1:newSize(2))-0.5)./scale(2)+0.5),oldSize(2));

%# Index old image to get new image:

outputImage = inputImage(rowIndex,colIndex,:);

另一个选择是使用内置的 interp2 函数,尽管您提到不想在其中的一个注释中使用内置的函数。

编辑:EXPLOATION

如果有人感兴趣,我想我会解释一下上面的解决方案是如何工作的...
newSize = max(floor(scale.*oldSize(1:2)),1);

首先,要获得新的行和列大小,将旧的行和列大小乘以比例因子。该结果用 floor 舍入到最接近的整数。如果比例因子小于1,您可能会遇到一个奇怪的情况,即大小值之一为0,这就是为什么对 max 的调用可以用1替换小于1的任何内容的原因。
rowIndex = min(round(((1:newSize(1))-0.5)./scale(1)+0.5),oldSize(1));
colIndex = min(round(((1:newSize(2))-0.5)./scale(2)+0.5),oldSize(2));

接下来,为行和列都计算一组新的索引。首先,计算上采样图像的一组索引:1:newSize(...)。每个图像像素都被视为具有给定的宽度,因此像素1的范围是0到1,像素2的范围是1到2,依此类推。因此,像素的“坐标”被视为中心,这就是为什么0.5从索引中减去。然后,将这些坐标除以比例因子,以得到原始图像的一组像素中心坐标,然后将其添加0.5,然后四舍五入以获得一组原始图像的整数索引。调用 min 可确保这些索引均不大于原始图像大小oldSize(...)
outputImage = inputImage(rowIndex,colIndex,:);

最后,只需简单地索引原始图像即可创建新的上采样图像。

09-30 18:15
查看更多