Questa risposta è più esplicativa che cercare di essere concisi ed efficienti. Penso che la soluzione di gnovice sia la migliore al riguardo. Se stai cercando di capire come funziona, continua a leggere ...
Ora il problema con il tuo codice è che stai mappando le posizioni dall'immagine di input all'immagine di output, motivo per cui stai ricevendo lo spot Uscita. Si consideri un esempio in cui l'immagine di ingresso è tutto bianco e uscita inizializzata al nero, otteniamo la seguente:
Cosa si dovrebbe fare è l'opposto (da uscita e ingresso). Per illustrare, si consideri la seguente notazione:
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]
L'idea è che per ogni posizione (i,j)
l'immagine di output in, vogliamo mappare nella posizione "più vicino" le coordinate di immagine di ingresso. Dal momento che si tratta di una semplice mappatura usiamo la formula che associa un dato x
a y
(dato tutti gli altri params):
x-minX y-minY
--------- = ---------
maxX-minX maxY-minY
nel nostro caso, x
è il i
/j
coordinata e y
è la ii
/jj
coordinata. Quindi sostituendo ciascun ci dà:
jj = (j-1)*(c-1)/(scaleC*c-1) + 1
ii = (i-1)*(r-1)/(scaleR*r-1) + 1
Mettendo insieme i pezzi, si ottiene il seguente codice:
% 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)
Spiacente, non so cosa stavo pensando - è necessario iterare l'uscita, non l'input, poiché l'output è più grande. E in quel caso le mie formule avrebbero bisogno di essere invertite. –