Esta respuesta es más explicativa que tratar de ser conciso y eficiente. Creo que la solución de gnovice es la mejor al respecto. En caso de que intente comprender cómo funciona, siga leyendo ...
Ahora el problema con su código es que está mapeando ubicaciones desde la imagen de entrada a la imagen de salida, razón por la cual está obteniendo el irregular salida. Consideremos un ejemplo donde la imagen de entrada es todo blanco y negro de salida inicializado a, obtenemos lo siguiente:
Lo que usted debe hacer es lo contrario (de salida a entrada). Como ejemplo, consideremos la siguiente notación:
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]
La idea es que para cada lugar (i,j)
la imagen de salida, queremos hacer un mapa de la ubicación "más cercano" en las coordenadas de imagen de entrada. Dado que este es un mapeo sencillo que usamos la fórmula que se asigna un determinado x
a y
(dados todos los otros parametros):
x-minX y-minY
--------- = ---------
maxX-minX maxY-minY
en nuestro caso, x
es el i
/j
coordenada y y
es el ii
/jj
coordinar. Por lo tanto, la sustitución para cada uno nos da:
jj = (j-1)*(c-1)/(scaleC*c-1) + 1
ii = (i-1)*(r-1)/(scaleR*r-1) + 1
poner las piezas juntas, obtenemos el siguiente código:
% 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)
Lo sentimos, no sé lo que estaba pensando - que necesita para repetir la salida, no se la entrada, ya que la salida es más grande. Y en ese caso mis fórmulas necesitarían ser revertidas. –