この答えは、簡潔で効率的にしようとするよりも説明的です。その点では、 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)