在MATLAB近邻插值算法(Nearest-neighbor interpolation algor

2019-07-22 01:41发布

我试图写我自己的使用最近邻插值算法扩大输​​入图像的功能。 坏的部分是我能看到它是如何工作的,但无法找到算法本身。 我会感谢任何帮助。

这里就是我试图通过的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

这里是后输出马克的建议

Answer 1:

前阵子我在的代码去imresize功能的MATLAB图像处理工具箱创建的图像只是最近邻居插值的简化版本。 下面是它如何适用于您的问题:

%# 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功能,虽然你提到不想在您的意见之一来使用内置函数。

编辑:说明

如果有人有兴趣,我想我会解释上述解决方案是如何工作的?

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,:);

最后,新的采样图像是通过简单地索引到原始图像创建的。



Answer 2:

这个答案是不是试图要简洁,高效的更多解释。 我觉得gnovice的解决方案是最好的在这方面。 如果你想了解它是如何工作的,请继续阅读...

现在用你的代码的问题是,你正在映射从输入图像的输出图像,这就是为什么你越来越参差不齐的输出位置。 考虑一个例子,其中输入图像是全白和输出初始化为黑色,我们得到如下:

你应该做的是相反的(从输出到输入)。 为了说明这一点,考虑下面的注释:

1           c         1                 scaleC*c
+-----------+ 1       +----------------------+ 1
|    |      |         |        |             |
|----o      |   <===  |        |             |
|  (ii,jj)  |         |--------o             |
+-----------+ r       |      (i,j)           |
  inputImage          |                      |
                      |                      |
                      +----------------------+ scaleR*r
                            ouputImage

Note: I am using matrix notation (row/col), so:
  i ranges on [1,scaleR*r] , and j on [1,scaleC*c]
  and ii on [1,r], jj on [1,c]

我们的想法是,对于每个位置(i,j)的输出图像中,我们希望把它映射到输入图像坐标“最近”的位置。 由于这是一个简单的映射,我们使用一个给定的映射式xy (给出的所有其他PARAMS):

 x-minX      y-minY
--------- = ---------
maxX-minX   maxY-minY

在我们的情况下, xi / j坐标和yii / jj坐标。 因此代替各给了我们:

jj = (j-1)*(c-1)/(scaleC*c-1) + 1
ii = (i-1)*(r-1)/(scaleR*r-1) + 1

把拼在一起,我们可以得到下面的代码:

% read a sample image
inputI = imread('coins.png');
[r,c] = size(inputI);
scale = [2 2];        % you could scale each dimension differently

outputI = zeros(scale(1)*r,scale(2)*c, class(inputI));

for i=1:scale(1)*r
    for j=1:scale(2)*c
        % map from output image location to input image location
        ii = round( (i-1)*(r-1)/(scale(1)*r-1)+1 );
        jj = round( (j-1)*(c-1)/(scale(2)*c-1)+1 );

        % assign value
        outputI(i,j) = inputI(ii,jj);
    end
end

figure(1), imshow(inputI)
figure(2), imshow(outputI)


Answer 3:

MATLAB已经做给你。 使用imresize :

output = imresize(input,size(input)*2,'nearest');

或者,如果你想同时调整X&Y同样,

output = imresize(input,2,'nearest');


Answer 4:

你只需要计算XLOC和yloc更广义的公式。

xloc = (j * (newwidth+1)) / (x+1);
yloc = (i * (newheight+1)) / (y+1);

这里假设你的变量有足够的范围的相乘的结果。



文章来源: Nearest-neighbor interpolation algorithm in MATLAB