Los extrapoladores de imágenes
son clases que permiten estimar puntos que están fuera de la imagen.
Son similares a los interpoladores, pero para puntos
exteriores. La idea es implementarlos como una estrategia, es decir una
clase que tiene una referencia a una imagen, a la cual podemos preguntar
por valores de pixeles con cualquier coordenada, dentro o fuera de la imagen.
La figura 3.3.1 muestra una imagen 2D 6 x 4 , en ella, el rango de las coordenadas es :
Una estrategia de extrapolación necesita tener
una referencia a la imagen de la correspondiente dimensión y una
función que me permita leer el valor de determinado punto ( el operador
que aparece en la figura ).
Puedo hacer algo del tipo:
bicotiImageImplementation2D< int > * ptr_ima; // declaro un puntero a una imagen 2D
Hago algo con la imagen ( primero la creo ) y luego :
bicotiImageExtrapolationStrategy2D< int > strategy;
strategy.SetImplementaion( ptr_ima );
Creo una estrategia de extrapolación y luego uso la función SetImplementation para setearle la imagen ( pasandole un puntero). Hay 2 cosas para observar aquí, primero que el template de la estrategia es el tipo de pixel de la imagen y por último, realmente no podemos instanciar una estrategia 2D ( es abstracta ) sino una de sus especializaciones.
Luego podemos pedir el valor de un pixel cualquiera:
pixel = strategy( 2, 3 );
Está en la imagen, entonces da el valor del pixel en ( 2 , 3 ) 1 en el ejemplo.
pixel = strategy( 124, 345 );
No está en la imagen , lo que devuelva depende de la estrategia concreta.
Hemos implementado 4 tipos de estrategias que parecen tener sentido en las aplicaciones.
Se pone en todo el exterior un valor constante que es seteado por el usuario.
bicotiImageExtrapolationStrategy2DConstant< int > strategy( 4 );
strategy.SetImplementaion( ptr_ima );
En este ejemplo, se pone en todo el exterior un 4. Como se muestra en la figura 3.3.3.
Se pone en el exterior el mismo valor
que el pixel más proximo dentro de la imagen.
Es decir , si la matrí es 2D.
A la izquierda, copio la primer columna.
A la derecha, copio la última columna.
Arriba, copio la primer fila.
Abajo, copio la última fila.
bicotiImageExtrapolationStrategy2DEqual< int > strategy;
strategy.SetImplementaion( ptr_ima );
Este ejemplo se muestra en la figura 3.3.4.
Se hace una simetría respecto
a la fila o columna más cercana.
Es decir , si la matrí es 2D.
A la izquierda, copio la segunda columna.
A la derecha, copio la penúltima columna.
Arriba, copio la segunda fila.
Abajo, copio la peúltima fila.
bicotiImageExtrapolationStrategy2DSimetric< int > strategy;
strategy.SetImplementaion( ptr_ima );
Este ejemplo se muestra en la figura 3.3.5.
Se completa la imagen como si fuera
cerrada por arriba y por abajo, como si fuera cíclica.
Es decir , si la matrí es 2D.
A la izquierda, copio la última columna.
A la derecha, copio la primer columna.
Arriba, copio la última fila.
Abajo, copio la primer fila.
bicotiImageExtrapolationStrategy2DCiclic< int > strategy;
strategy.SetImplementaion( ptr_ima );
Este ejemplo se muestra en la figura 3.3.6.
Para una descripción más detallada de la clases ver :
bicotiImageExtrapolationStrategy
bicotiImageExtrapolationStrategy2D
bicotiImageExtrapolationStrategy2DConstant
bicotiImageBorderStrategy2DEqual
bicotiImageBorderStrategy2DSimetric
bicotiImageBorderStrategy2DCiclic
bicotiImageExtrapolationStrategy3D
bicotiImageBorderStrategy3DConstant
bicotiImageBorderStrategy3DEqual
bicotiImageBorderStrategy3DSimetric
bicotiImageBorderStrategy3DCiclic