3.1.3 - Frame Iterators.
Los frame iterators son una clase especial de iteradores. La diferencia con los iteradores típicos radica en que en lugar de devolver un pixel devuelven una vecindad del mismo, es decir un frame.
Podemos pensar que el iterador se trata de un puntero al pixel sobre el que estamos parados y el frame es un cuadrado ( o cubo en 3D ) centrado en dicho pixel.
La forma de recorrer una imagen con un FrameIterator es
análoga a hacerlo con un iterador común.
Se disponen de funciones como :
operator ++ -- Para moverlo.
First( ) -- Para ponerlo al principio.
IsDone( ) -- Para saber si llegamos
al final
GetCurrentFrame( ) -- Devuelve un
puntero al frame actual.
Hay que destacar que el frame debe se cuadrado e impar para que no exista ambiguedad respecto a cual es el centro.
Hay dos diferencias sustanciales con respecto a los iteradores
de imagenes.
-Primero que un FrameIterator es unidireccional,
es decir que no se lo puede usar para escribir sobre la imagen. Se puede
leer un frame, pero no escribirlo.
-Segundo, por razones de simplicidad, no se utilizan
estrategias de borde para elegir una recorrida por defecto. La recorrida
se hace siempre incrementando X0 , luego X1 y luego X2.
En la figura 3.1.3.1 se muestra el arbol de herencia de los FrameIterators.
Debido a la forma en que se implementaron, se los puede
independizar del tipo de imagen, habiendo especializaciones solo en la
dimensión.
Para construirlos se usa el Factory Method, la forma
de hacerlo es similar al caso de iteradores.
bicotiImageFrameIterator<
PixelType > * ptr_iterator;
ptr_iterator
= ptr_image->CreateFrameIterator( );
Estrategia de Extrapolación
En estos iteradores aparece un problema que no teníamos antes. Como se ilustra en la figura 3.1.3.3. cuando estamos en puntos del borde, algunos pixeles del frame caen fuera de la imagen, el iterador debe decidir que poner en esos lugares.
Para hacer que esta decisión sea flexible, se le
asocia al iterador una estrategia
de extrapolación, la que indicará que criterios seguir
para rellenar el borde exterior.
El iterador tendrá una referencia a la estrategia
de extrapolación, que debe ser seteada cuando se crea el iterador.
De esta forma el FrameIterator nos permite recorrer la
imagen y analizar la vecindad de un pixel sin preocuparnos por si estamos
o no en el borde.
Ver las clases concretas para más detalles sobre las funciones.
bicotiImageFrameIterator
bicotiImageFrameIterator2D
bicotiImageFrameIterator3D