MATLAB中的最近邻插值算法 [英] Nearest-neighbor interpolation algorithm in MATLAB

查看:708
本文介绍了MATLAB中的最近邻插值算法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I am trying to write my own function for scaling up an input image by using the Nearest-neighbor interpolation algorithm. The bad part is I am able to see how it works but cannot find the algorithm itself. I will be grateful for any help.

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

Here's what I tried for scaling up the input image by a factor of 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

这是功能在 MATLAB图像处理工具箱,为最近邻图像插值创建简化版本。以下是它将如何应用于您的问题:

Here is the output after function in the MATLAB Image Processing Toolbox to create a simplified version for just nearest neighbor interpolation of images. Here's how it would be applied to your problem:

%# 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 功能,虽然你提到不想使用内置的在你的一条评论的功能中。

Another option would be to use the built-in interp2 function, although you mentioned not wanting to use built-in functions in one of your comments.

编辑:说明

以防万一任何人都有兴趣,我想我会解释上面的解决方案是如何工作的......

In case anyone is interested, I thought I'd explain how the solution above works...

newSize = max(floor(scale.*oldSize(1:2)),1);

首先,为了获得新的行和列大小,旧的行和列大小乘以比例因子。此结果使用 floor <舍入到最接近的整数/ code> 。如果比例因子小于1,你可能会得到一个大小值为0的奇怪情况,这就是调用 max 可以用1替换小于1的任何内容。

First, to get the new row and column sizes the old row and column sizes are multiplied by the scale factor. This result is rounded down to the nearest integer with floor. If the scale factor is less than 1 you could end up with a weird case of one of the size values being 0, which is why the call to max is there to replace anything less than 1 with 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(...)

Next, a new set of indices is computed for both the rows and columns. First, a set of indices for the upsampled image is computed: 1:newSize(...). Each image pixel is considered as having a given width, such that pixel 1 spans from 0 to 1, pixel 2 spans from 1 to 2, etc.. The "coordinate" of the pixel is thus treated as the center, which is why 0.5 is subtracted from the indices. These coordinates are then divided by the scale factor to give a set of pixel-center coordinates for the original image, which then have 0.5 added to them and are rounded off to get a set of integer indices for the original image. The call to min ensures that none of these indices are larger than the original image size oldSize(...).

outputImage = inputImage(rowIndex,colIndex,:);

最后,只需将索引编入原始图像即可创建新的上采样图像。

Finally, the new upsampled image is created by simply indexing into the original image.

这篇关于MATLAB中的最近邻插值算法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆