这个回答更注重解释而非简洁高效。我认为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),我们希望将它映射到输入图像坐标中"最近"的位置。由于这是一个简单的映射,我们使用将给定的x
映射到y
的公式(给定所有其他参数):
x-minX y-minY
--------- = ---------
maxX-minX maxY-minY
在我们的情况下,x
是 i
/j
坐标,而 y
是 ii
/jj
坐标。因此,将每个坐标替换为其对应的值得到:
jj = (j-1)*(c-1)/(scaleC*c-1) + 1
ii = (i-1)*(r-1)/(scaleR*r-1) + 1
将所有部分组合起来,我们得到以下代码:
inputI = imread('coins.png');
[r,c] = size(inputI);
scale = [2 2];
outputI = zeros(scale(1)*r,scale(2)*c, class(inputI));
for i=1:scale(1)*r
for j=1:scale(2)*c
ii = round( (i-1)*(r-1)/(scale(1)*r-1)+1 );
jj = round( (j-1)*(c-1)/(scale(2)*c-1)+1 );
outputI(i,j) = inputI(ii,jj);
end
end
figure(1), imshow(inputI)
figure(2), imshow(outputI)