Dado un pixel, que puede ser un
tipo básico o uno estructurado definido por el usuario definimos
un
atributo del pixel como alguna
propiedad del mismo.
Es decir , suponemos que existe
una función f tal que :
Atributo = f ( Pixel )
Por ejemplo el nivel de gris es
un caso particular de atributo, cuando el pixel es un int o char es el
propio
valor, pero cuando es un flotante
habrá que redondearlo y cuando es un RGB deberá tomarse un
promedio ponderado entre los tres
campos.
Podría tomarse como atributo
de un pixel vectorial, una combinación lineal de sus campos, por
ejemplo en
RGB podría tomarse alguno
de los colores como atributo.
En principio el atributo de un
pixel podría ser cualquier propiedad que a uno se le ocurra.
Obs : El tipo de retorno es un template, AttributeType, que en principio debe ser un tipo básico ( nativo del lenguaje ).
La función que lleva un pixel
en un atributo, debe ser invertible, es decir que debe darse alguna manera
de modificar el atributo y hallar el pixel que le corresponda. Aunque analíticamente
la función no pueda inveritrse. Un ejemplo de esto es cuando tenemos
un pixel RGB y tomamos el campo rojo como atributo. Si modificamos el valor
del rojo, existen infinitos pixeles RGB con dicho valor, pero en términos
prácticos tratamos de no modificar los demás campos.
La función inversa es de
la forma :
Pixel = g ( Atributo , Pixel )
Retorna un pixel cuyo atributo es el que le paso, pero como me pasan el pixel original tengo información adicional. En el caso del ejemplo tomo el pixel que me pasan, le modifico el rojo al color que me indican y devuelvo el pixel resultante.
La necesidad de esta función surge de los algoritmos que ecualizan el histograma de una imagen, modificando los atributos de los pixeles y no los pixeles mismos. En estos algoritmos para modificar la imagen hay que tener una forma de ir del atributo al pixel.
Ver DexelHistogram.
Los selectores de atributos implementados actualmente son los siguientes, como se indica el la estructura jerárquica de la Figura 1.2.2.
- bicotiPixelAttributeSelector
- bicotiPixelAttributeSelectorNone
- bicotiPixelAttributeSelectorRound
- bicotiPixelAttributeSelectorColorRed
- bicotiPixelAttributeSelectorColorGreen
- bicotiPixelAttributeSelectorColorBlue
- bicotiPixelAttributeSelectorColorVectorial
Todos los selectors de atributos heradan de una clase abstracta llamada bicotiPixelAttributeSelector. Existe un template en estos objetos, donde se pasa como argumento el pixel que se esta usando y el tipo de atributo que se desea seleccionar.La única restricción para estos objetos, es que tengan definida las funciones:
AttributeType
operator( ) ( PixelType )
Esta es la
que se invoca en los algoritmos donde hay que pasar un bicotiPixelAttributSelector,
como parámetro.
PixelType
Inverse( PixelType , AttributeType )
Daremos la descripción de la clase bicotiPixelAttributeSelector.
class bicotiPixelAttributeSelector< class AttributeType,
class PixelType = AttributeType >
virtual
AttributeType operator( ) ( PixelType )=0
virtual
PixelType Inverse( PixelType , AttributeType
)=0