3 - Acceso Standard

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.

Figura 3.1.3.2

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.

Figura 3.1.3.1

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.

Figura 3.1.3.3.

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