这个答案比试图简洁有效的解释性更强。我认为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
将各个部分放在一起,我们得到以下代码:
% 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)