Autor Tema: Hallar la similitud entre dos imágenes en forma de matriz

0 Usuarios y 1 Visitante están viendo este tema.

29 Julio, 2013, 11:47 pm
Leído 2271 veces

tasel

  • $$\Large \color{#6a84c0}\pi$$
  • Mensajes: 2
  • Karma: +0/-0
  • Sexo: Masculino
Hola a todos!

Soy un teleco programador que necesita un cable. He creado recientemente Mosaime, una web muy chula para hacer mosaicos con tus propias fotos. La dirección es mosai.me
Recientemente he mejorado el algoritmo de creación de mosaicos, pero es imperfecto porque me he inventado una fórmula matemática, y estoy seguro de que hay un método mejor. Por eso posteo aquí. Si el subforo que he elegido es incorrecto, disculpen las molestias.

El problema es el siguiente:

Tengo una matriz de, por ejemplo, 5x5. La matriz tiene valores enteros entre 0 y 255. Esta matriz representa un canal de color de una imagen.
Por otro lado, tengo un listado de muchas matrices del mismo tamaño y de mismas características, que también representan imágenes.
El problema reside en averiguar qué matriz de la del listado se parece más a la matriz dada al principio.
Estas matrices son cada una de las fotos pequeñas que componen los fotomosaicos.

Pero, ¿qué es parecerse? Lo explico con un ejemplo.

Mi primera idea fue usar distancia euclídea, tomando cada elemento de la matriz como una dimensión independiente.
El problema de este método es que dada la siguiente matriz:

\( \begin{pmatrix} 50 & 50 & 50 \\ 50 & 50 & 50 \\ 50 & 50 & 50 \end{pmatrix} \)

dista igual de estas dos matrices:

\( \begin{pmatrix} 10 & 10 & 10 \\ 10 & 10 & 10 \\ 10 & 10 & 10 \end{pmatrix} \)
\( \begin{pmatrix} 10 & 10 & 90 \\ 10 & 90 & 90 \\ 90 & 90 & 90 \end{pmatrix} \)

Cuando las imágenes no se parecen nada. En esta situación, elegir la primera matriz como la más parecida sería un acierto porque el color es más uniforme, al igual que en la matriz primera. Sin embargo, en la segunda hay un contraste fuerte en un lado. Al sustituirla, quedaría mal.

Por tanto, yo diría que influye la desviación típica. Digamos que dos matrices de imágenes son parecidas cuando tienen una baja distancia euclídea y desviaciones típicas similares. Si las dos condiciones anteriores se cumplen, entonces una matriz será susceptible de ser sustituida por la otra y el mosaico se verá bien.

¿Se os ocurre alguna herramienta que permita obtener una distancia según estas condiciones?

Mi solución provisional ha sido calcular la distancia euclídea como he dicho antes, pero introduciendo dentro de la raíz la diferencia de desviaciones típicas. Totalmente inventado empíricamente para que me quedaran bien los mosaicos.
Quizás la solución sea muy obvia. Si es fácil mejor.

Muchas gracias por vuestro tiempo!! :)

30 Julio, 2013, 03:30 am
Respuesta #1

Héctor Manuel

  • Lathi
  • Mensajes: 3,701
  • País: mx
  • Karma: +0/-0
  • Sexo: Masculino
Hola. Conozco algo del tema, ya que en mi maestría tuve que hacer análisis de imágenes reales de corazones para detectar anomalías cardíacas (aunque la verdad no sé por qué me pidieron hacer eso  :P)

1) Lo primero que haría sería "normalizar", ya que vamos a hacer comparaciones. Es decir, cambiar la escala 0-255 a 0-1. Claro, esto se hace de forma lineal. Además porque nos permitirá utilizar distribuciones de probabilidad.

2) Hecho lo anterior, se me ocurren dos cosas:
 
  2a) No utilizar la distancia euclídea como la planteas. Razón? Hasta donde recuerdo, esta distancia no nos da un espacio normado en el espacio de matrices, de modo que perdemos toda la geometría. Me parece mejor utilizar la norma uniforme:  http://es.wikipedia.org/wiki/Norma_matricial (es la que aparece como \( \|A\|_{\infty} \)). No conozco tu nivel en matemáticas, así que no me aventuro a decirte el por qué formalmente. Pero si tu curiosidad es mucha, imagina que las matrices son funciones lineales de \( \mathbb{R}^n \) en \( \mathbb{R} \) (es decir, funcionales). Entonces con esta distancia, dos matrices son casi iguales si sus gráficas son tremendamente parecidas.

  2b) Otro camino es irnos sobre probabilidades. Obtén una distribución de probabilidad que aproxime a tu imagen dada. Esto lo puedes hacer con un histograma. Una vez hecho esto, obtén la distribución de probabilidad de cada una de tus imágenes prueba. Elige como la mejor a aquella cuya distribución de probabilidad es más parecida a la dada. Para hacer esto, calcula el máximo de cada distribución de probabilidad. Luego, realiza la operación \( |\max_{dada}-\max{prueba}| \) para cada máximo encontrado. La mejor distribución será aquella que nos de el menor resultado de los valores absolutos anteriores ( y de hecho, el por qué de esto, es la misma idea de 2a).


Por otra parte, creo que tu problema se pondrá peor. Imagino que trabajas en RGB y no únicamente en blanco y negro, de modo que seguro por cada imagen tienes tres matrices. Es correcto?

Saludos.

30 Julio, 2013, 03:31 pm
Respuesta #2

tasel

  • $$\Large \color{#6a84c0}\pi$$
  • Mensajes: 2
  • Karma: +0/-0
  • Sexo: Masculino
Muchas gracias Héctor Manuel!

Tengo que analizar tu respuesta cuando tenga tiempo. Por ahora se me ha ocurrido una posible pega al método 2b.

Corrígeme si me equivoco. Un histograma podría representar a una imagen que sea blanca por la izquierda y negra por la derecha. Otra imagen que sea al revés (blanco en derecha, negro en izquierda) tendría el mismo histograma. En realidad, dichas imágenes son muy diferentes y no serviría.
Es un razonamiento totalmente intuitivo que me ha salido al pensar en histogramas, pero ya digo que puede que no sea el caso.

Respecto a los canales, es correcto que habría que aplicar esto luego tres veces. Luego habría que obtener una medida global que contase los resultados obtenidos para el canal R, el G y el B.

Otro último detalle que no mencioné es que el método debería ser algorítmicamente lo más simple posible. Todo el proceso se hace en Java, que no es un lenguaje de programación muy pensado para cálculos complejos. Está hecho así porque es el lenguaje que mejor conozco, y simplifica mucho las cosas en el servidor web.

Voy a mirarme cuando pueda la norma uniforme para ver cómo aplicarla.

Un saludo!

30 Julio, 2013, 06:41 pm
Respuesta #3

Héctor Manuel

  • Lathi
  • Mensajes: 3,701
  • País: mx
  • Karma: +0/-0
  • Sexo: Masculino
Corrígeme si me equivoco. Un histograma podría representar a una imagen que sea blanca por la izquierda y negra por la derecha. Otra imagen que sea al revés (blanco en derecha, negro en izquierda) tendría el mismo histograma. En realidad, dichas imágenes son muy diferentes y no serviría.

No. Los histogramas sí varían. Por ejemplo, como dices, si tienes una imagen de blanco a negro y otra de negro a blanco, sus histogramas sí sería distintos (aunque simétricos: es decir, uno es el espejo del otro, pero esto no es malo). El detalle del histograma es que dado uno histograma, no es posible restablecer la imagen del que proviene (un histograma puede pertenecer a varias imágenes distintas), pero por el tipo de trabajos que dices hacer, difícilmente se te presentará este problema.

Desconozco cómo hacer esto en java. Yo trabajaba en matlab haciendo el procesamiento de imágenes.
Saludos.