這個答案比試圖簡潔和高效更具有解釋性。我認爲gnovice的解決方案在這方面是最好的。如果你想了解它是如何工作的,請繼續閱讀...
現在你的代碼的問題是你將輸入圖像的位置映射到輸出圖像,這就是爲什麼你會得到spotty輸出爲。考慮一個例子,其中輸入圖像是全白和輸出初始化爲黑色,我們得到如下:
你應該做的是相反的(從輸出到輸入)。爲了說明這一點,考慮下面的符號:
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
(給所有其他PARAMS)式中:
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)
對不起,不知道我在想什麼 - 你需要遍歷輸出,不輸入,因爲輸出較大。在這種情況下,我的公式需要顛倒。 – 2009-10-12 00:47:17