我正在尝试编写自己的函数,以使用最近邻插值算法按比例放大输入图像。不好的部分是我能够看到它是如何工作的,但是找不到算法本身。我将不胜感激。
这是我尝试将输入图像放大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,:);
最后,只需简单地索引原始图像即可创建新的上采样图像。