この回答は、簡潔かつ効率的であることを確認するよりも説明的です。私はその点で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
に(与えられた他のすべての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)
申し訳ありませんが、私が考えていたかわからないが - あなたは、出力を反復処理する必要はありません出力はより大きいので、入力。そしてその場合、私の公式は逆にする必要があります。 –