Práctica 2: Transformación log-polar
Transcripción
Práctica 2: Transformación log-polar
Curso de doctorado: Técnicas Avanzadas de Visión por Computador Práctica 2: Transformación log-polar Se plantean unos sencillos ejercicios para ilustrar algunos aspectos relacionados con la implementación por software de la transformación log-polar y con el procesamiento de estas imágenes. 1. Transformación log-polar directa e inversa Se proporciona la clase LogPolarMapper que construye la relación entre coordenadas cartesianas y log-polares. Esta clase es independiente de qué estructura de datos se utilice para representar imágenes; únicamente requiere información sobre la geometrı́a de las imágenes cartesianas y log-polar. Para realizar la transformación log-polar sobre imágenes de la spToolkit se proporciona la clase Lp4Sp, que extiende la clase LogPolarMapper. 1. Define los métodos Lp4Sp::c2lp() y Lp4Sp::lp2c() para obtener una imagen log-polar a partir de una cartesiana o al revés, respectivamente. Utiliza la clase Image para simplificar el trabajo con imágenes de niveles de gris de la spToolkit. Te interesa conozcer algunos datos miembro de LogPolarMapper (y que hereda Lp4Sp): LPmap[i][j] contiene el pı́xel log-polar (u, v) asociado al pı́xel cartesiano (i, j). LPinvMap[u][v] es una lista de los pı́xels cartesianos (i, j) correspondientes al campo receptivo asociado al pixel log-polar (u, v). 2. Comprueba el funcionamiento de ambos métodos, realizando la transformación log-polar (y log-polar inversa) de alguna imagen. Prueba con diferentes valores de los parámetros R, S, ρmı́n y ρmáx , observando el efecto sobre las imágenes cortical y retı́nica. ¿Cómo varı́an los otros parámetros a y q? El valor de estos parámetros se pueden consultar, por ejemplo, con los métodos LogPolarMapper::getRFGrowthRatio() y LogPolarMapper::getSectorsPerRadian(), respectivamente. 3. Con la ayuda de la clase Time que se proporciona, observa los tiempos de: Inicializar la transformación log-polar. Para unos mismos parámetros de las imágenes cartesianas y log-polar, esta operación sólo es necesario realizarla una vez (off-line). Realizar la conversión log-polar. Esta conversión se lleva a cabo cada vez que se quiere convertir una imágen cartesiana a log-polar. Realizar la conversión log-polar inversa. Esta transformación sólo es necesaria para visualizar de forma más intuitiva el contenido de la imágen log-polar. Durante un proceso de tiempo crı́tico, por ejemplo, podrı́a evitarse. 2. Cálculo del centroide de una región Se da la función computeCentroidC() para calcular el centroide (xc , yc ) de una región en una imágen cartesiana. Para simplificar, utilizaremos una imágen totalmente en negro sobre la que situaremos una imagen más pequeña (en este caso de una cara). Podremos controlar en qué posición ponemos esta imágen con la función pasteImgOnImg(), que permite “pegar” una imagen sobre otra en una cierta posición (x, y). Puesto que el 1 fondo es negro, P se puede localizar la región de interés de la imagen I detectando los n pı́xels que no son negros: (xc , yc ) = n1 I(x,y)>0 (x, y). 1. Verifica el funcionamiento de computeCentroidC() comparando el centroide devuelto por esta función y la posición en que hemos situado la imagen de la cara. ¿Coinciden? 2. Realiza la transformación log-polar de la imagen cartesiana que contiene la cara. Cambia la posición de la cara en la imagen cartesiana original y observa su localización en la imágen log-polar. Visualiza también la imagen log-polar transformada al espacio cartesiano para apreciar cómo se visualiza la cara. 3. Ahora aplica computeCentroidC() a estas imágenes log-polares ¿Se detecta bien el centroide? ¿Por qué? 4. Escribe computeCentroidLP() para que funcione adecuadamente en imágenes log-polares. Pista: utiliza el método LogPolarMapper::computeIJ(). 5. Compara los centroides que se obtienen localizando la cara en la imágen cartesiana y en la imagen logpolar. Realiza el análisis variando R y la excentricidad de la posición de la cara. ¿Qué puede deducirse? 6. Compara también los tiempos de detección en el caso cartesiano y log-polar. ¿Hay alguna diferencia significativa? 3. Suavizado de una imagen La función meanFilterC() realiza un suavizado de una imagen aplicando un simple promediado de los niveles de gris en una vecindad m × m. 1. Utiliza esta función para suavizar una imagen cartesiana y su correspondiente log-polar. ¿Funciona en ambos casos? 2. Escribe meanFilterLP() para aplicar este filtro media sobre imagenes log-polares y corregir el comportamiento observado. 3. Compara las correspondientes imágenes suavizadas en los dominios cartesiano y log-polar. ¿Se obtiene resultados equivalentes? 4. Si L(I) representa la transformación log-polar de la imagen cartesiana I, y meanFilter(I) es la imagen resultante de aplicar el filtro media sobre una imagen I, ¿ocurrirá que L(meanFilter(I)) = meanFilter(L(I))? 5. Analiza experimentalmente la ganancia temporal que se obtiene en este caso. ¿Es mayor, menor o igual que en el ejercicio anterior (cálculo del centroide)? 4. Rotaciones y escalados 1. Realiza una rotación (ángulo θ) y un escalado (factor de cambio de escala α) de una imagen cartesiana y obtén la imágen log-polar de las imágenes cartesianas antes y después de la transformación geométrica. Utiliza los métodos Rotate() y Scale() de Image. 2. Compara visualmente el efecto de estas operaciones geométricas en las imágenes cartesianas y log-polar. ¿Qué se observa? 3. Puesto que los ángulos rotados y el factor de escala aplicados se relacionan con la traslación en cada uno de los ejes del dominio log-polar, aplica la traslación (usa Image::Translation()) sobre la imágen logpolar anterior para “deshacer” la transformación (θ, α) y obtener la imagen cartesiana correspondiente. ¿Qué resultados se obtienen? ¿Cómo se podrı́an mejorar o corregir? 5. Conclusiones Sintetiza las observaciones realizadas y las principales conclusiones a las que hayas llegado. 2