Foros del Web » Programando para Internet » PHP »

Buscar similitudes entre imágenes

Estas en el tema de Buscar similitudes entre imágenes en el foro de PHP en Foros del Web. Esta tarde, dando rienda suelta a mi imaginación mientras analizaba, a fuerza de tijeras y pegamento un cariotipo humano (dicho trabajo trata, básicamente de buscar ...
  #1 (permalink)  
Antiguo 28/04/2008, 13:59
Avatar de hvpareja  
Fecha de Ingreso: marzo-2007
Ubicación: En Vélez Málaga (Málaga)
Mensajes: 213
Antigüedad: 17 años, 1 mes
Puntos: 4
Buscar similitudes entre imágenes

Esta tarde, dando rienda suelta a mi imaginación mientras analizaba, a fuerza de tijeras y pegamento un cariotipo humano (dicho trabajo trata, básicamente de buscar las parejas de cromosomas), se me ocurrió comprobar la potencia de php con sus librerías de gráficos y estuve buscando en mi oráculo (Google), pero no encontré nada.

Por tanto, quiero compartir esta iniciativa con vosotros, mis maestros, y os propongo que abramos un debáte para ver hasta qué punto podríamos acercarnos a un software más o menos competente que automatice el trabajo del biólogo.

Empiezo yo:

Tenemos una imágen con 46 cromosomas desordenados y queremos ordenarlos por tamaño y emparejarlos (adjunto imágenes). Supongo que habrá que comenzar con un sistema en el que podamos separar los cromosomas como entidades aisladas, con propiedades como la longitud y un array que describa las bandas oscuras/claras por las que están compuestas... a partir de ahí... os reto a que aporteis buenas ideas...

¿Cómo lo veis?¿Es viable?


  #2 (permalink)  
Antiguo 28/04/2008, 17:50
Avatar de .php  
Fecha de Ingreso: julio-2006
Mensajes: 481
Antigüedad: 17 años, 9 meses
Puntos: 5
Re: Buscar similitudes entre imágenes

lo primero que pienso, es bastante interesante el tema, pero no olvides que varias paginas ocupan este metodo para ingresar a un formulario o registrarse en un pagina (rapidshare, los correos, hotmailm gmail, etc..) y lo hacen para acegurarse que hay una persona detras del pc y no sea un programa intentando de hackear, postar , etc.. hasta ahora es el mejor metodo de verificacion y si alguien lo hace o descubres como leer esas letras tendrás resuelto tu problema, lo que yo haria intentaria de leer el codigo hexadecimal de la imagen y ver las diferencias de una con otra hasta encontrar como compararlas.

suerte!!
__________________
~~[FiDeLio]~~
  #3 (permalink)  
Antiguo 28/04/2008, 18:01
Avatar de hvpareja  
Fecha de Ingreso: marzo-2007
Ubicación: En Vélez Málaga (Málaga)
Mensajes: 213
Antigüedad: 17 años, 1 mes
Puntos: 4
Re: Buscar similitudes entre imágenes

Es cierto que los robots utilizan este método para saltarse la seguridad de los sistemas "captcha", y estoy enterado por propia experiencia que actualmente los hay muy potentes, sin embargo, no pretendo con esto nada por el estilo, además, ya ves que estas imágenes cada vez están más borrosas para evitarlos... "la necesidad hace al órgano".

A lo largo de esta tarde he seguido trabajando en lo mismo y estoy aprendiendo bastante de las funciones de la librería gd2 de php; además estoy avanzando bastante más de lo que pensaba, puesto que el programa que estoy desarrolando tiene más sensibilidad a los colores que el ojo humano, y puede ser de gran utilidad para un análisis más profundo de cromosomas con este tipo de bandeado.

Efectivamente estoy haciéndolo como propones y va muy bien, te cuento.

1. Determinar el color de fondo de la imagen: introduzco todos los colores en un array bidimensional y busco el más frecuente, que gana con mucho al segundo; ese es el fondo.

2. Crear un hipertexto que muestre los valores de los colores de los pixeles que no coinciden con el fondo (con un margen de error bastante sensible): así tengo los cromosomas dibujados con puro texto. Esto lo hemos visto mil veces por este foro.

3. (Estoy trabajando en esto) Cuando la matriz localiza una zona donde predominan colores que no son como el fondo, chequea en las 4 direcciones de su alrededor y va guardando en una matriz los valores de los colores de los pixeles que constituyen el cromosoma; así, en dicha matriz, tengo al cromosoma como una entidad aislada...

... y bueno por ahora esto es todo, agradezco mucho que me aporteis ideas; ya os seguiré contando.
  #4 (permalink)  
Antiguo 28/04/2008, 18:20
Avatar de .php  
Fecha de Ingreso: julio-2006
Mensajes: 481
Antigüedad: 17 años, 9 meses
Puntos: 5
Re: Buscar similitudes entre imágenes

insisto, si haces buen uso a tu programacion ten por seguro que es bastante interesante para hospitales, analises de bacteria, yo vivo en chile y hay varias salmonoreas y empresas que ralizan muestras de bacteria, etc. en los salmones, te imaginas si tu programa ubiese detectado el virus ISA.
__________________
~~[FiDeLio]~~
  #5 (permalink)  
Antiguo 28/04/2008, 18:27
Avatar de hvpareja  
Fecha de Ingreso: marzo-2007
Ubicación: En Vélez Málaga (Málaga)
Mensajes: 213
Antigüedad: 17 años, 1 mes
Puntos: 4
Re: Buscar similitudes entre imágenes

Bueno, a ver, estoy acabando Biología y no pienso que lo que yo esté haciendo sea la panacea, hay sistemas mucho más sofisticados que esto, como por ejemplo técnicas de fluorescencia (FISH) etc. Agradezco mucho tu interés por el tema, pero ahora mismo lo que me interesa es centrarme en lo que estoy haciendo, en código PHP y en las librerías gd; solo por aprender.

No quiero enfocar este tema a la biología puesto que eso no es lo que se habla en este foro, esto es, simplemente, un proyecto en php con imágenes.

Dicho esto, espero que os motiveis y que podamos sacar cosas interesantes a partir de esta "gotita" de iniciativa.
  #6 (permalink)  
Antiguo 28/04/2008, 19:05
Avatar de .php  
Fecha de Ingreso: julio-2006
Mensajes: 481
Antigüedad: 17 años, 9 meses
Puntos: 5
Re: Buscar similitudes entre imágenes

asi, empizan los proyectos grandes.

uno es bastante tecnico o solo nos gusta hacer las cosas, pero uno con una buena idea y un buen vendedor que venda hilo en el polo sur. Demás que sera un buen aporte.
linus tolvar no hizo el linux, pero el tubo la idea
__________________
~~[FiDeLio]~~
  #7 (permalink)  
Antiguo 28/04/2008, 20:49
 
Fecha de Ingreso: abril-2008
Ubicación: Montevideo - Uruguay
Mensajes: 156
Antigüedad: 16 años
Puntos: 5
Re: Buscar similitudes entre imágenes

Hi !

En un par de revistas ".CODE" hay unos tutoriales de reconocimiento optico de caracteres... Es "un clasico", obviamente es solo la teoria, no tiene ejemplos de ningun lenguaje especifico, pero la verdad es que me encantó el desafio...

Si tengo tiempo trataré de hacer algo y posteo lo que llevo :)

-ByE-
  #8 (permalink)  
Antiguo 29/04/2008, 03:47
Avatar de hvpareja  
Fecha de Ingreso: marzo-2007
Ubicación: En Vélez Málaga (Málaga)
Mensajes: 213
Antigüedad: 17 años, 1 mes
Puntos: 4
Re: Buscar similitudes entre imágenes

Bueno, no lo dejes, me encantaría que me pasaras toda la información que encuentres al respecto, es bueno documentarse... indispensable. Estoy a la espera de aportes, yo sigo con lo mio, esta tarde posteo si veo que he avanzado

Un saludo, gracias.
  #9 (permalink)  
Antiguo 02/05/2008, 05:26
Avatar de hvpareja  
Fecha de Ingreso: marzo-2007
Ubicación: En Vélez Málaga (Málaga)
Mensajes: 213
Antigüedad: 17 años, 1 mes
Puntos: 4
Re: Buscar similitudes entre imágenes

Noticias nuevas, necesito vuestra ayuda:

Mirad, me he atascado un poco;

El código que estoy haciendo escanea la imagen de izquierda a derecha, cuando llega al final baja una linea y otra vez comienza de izquierda a derecha. Pero cuando llega a un sitio que encuentra varios pixeles que no coinciden con el "fondo" (recordad que es el color que más se repite) se para y comienza otra función que pretende aislar el cromosoma metiéndolo en un array:

Ahí está mi problema, se me ocurrió haciendo, primero una función que cambie de dirección el puntero, así, cuando llega al fondo cambia y sigue introduciendo los pixeles en el array conforme baja en el eje de la y. Es, para que lo entendais, una especie de búsqueda en "s" por encima del cromosoma; pero no funciona muy bien, solo coge la puntita del cromosoma, y ya he probado con varias imágenes distintas y hace lo mismo, hay algo que lo para.

Necesito que me propongais una solución distinta, ¿cómo lo haríais?¿cómo lo hago?
  #10 (permalink)  
Antiguo 02/05/2008, 10:59
 
Fecha de Ingreso: abril-2008
Ubicación: Argentina
Mensajes: 20
Antigüedad: 16 años
Puntos: 2
Re: Buscar similitudes entre imágenes

Se me ocurre algo que yo habia pensado para hacer OCR, luego nunca lo implemente.
Seria mas simple la comparacion entre dos imagenes, que adivinar lo que esta dibujado. Si pudieras tener el mismo cromosoma en varias posiciones y luego cuando encuentras uno, como dijiste que ya habias hecho esa parte, lo tomas en un recuadro y lo comparas contra el resto de las imagenes fijas en las distintas posiciones (cuantas mas posiciones mas exactitud).
Se me ocurre que los OCR deben hacer algo asi, obviamente con letras es mas facil, pero podrias hacer una aproximacion a eso.
Tambien se me ocurre que en tu caso es importante entender en que posicion esta la imagen para compararlas vertical, horizontal o cuantos grados de rotacion. Bueno espero que te sirva mi idea.. Saludos
  #11 (permalink)  
Antiguo 02/05/2008, 11:13
Avatar de hvpareja  
Fecha de Ingreso: marzo-2007
Ubicación: En Vélez Málaga (Málaga)
Mensajes: 213
Antigüedad: 17 años, 1 mes
Puntos: 4
Re: Buscar similitudes entre imágenes

Si, me parece genial lo que me dices! Pero ayúdame, ¿cómo delimito ese recuadro del que me hablas? Conozco una función de gd2 que crea una imagen a partir de un fragmento de otra, esa es mi idea, pero claro, me pierdo a la hora de buscar el cromosoma.

Luego lo de rotarlo y eso, es más adelante, en un principio lo que necesito es que me ayudeis a esto, "buscar el cromosoma".
  #12 (permalink)  
Antiguo 05/05/2008, 08:33
 
Fecha de Ingreso: abril-2008
Ubicación: Montevideo - Uruguay
Mensajes: 156
Antigüedad: 16 años
Puntos: 5
Re: Buscar similitudes entre imágenes

Hi !

Podrias poner el codigo de la función que recorre la pantalla asi vemos en que falla y porque se para.
El metodo que utilizas me parece el indicado para la situación, es más, no pensé en otro.

-ByE-
  #13 (permalink)  
Antiguo 05/05/2008, 08:58
Avatar de hvpareja  
Fecha de Ingreso: marzo-2007
Ubicación: En Vélez Málaga (Málaga)
Mensajes: 213
Antigüedad: 17 años, 1 mes
Puntos: 4
Re: Buscar similitudes entre imágenes

Pienso ponerlo pero he desechado esta opción con la que estaba trabajando y estoy intentando usar una que se basa en las listas enlazadas

Os posteo lo que llevo, la función arbol(), es en la que estoy liado, quiero que vaya guardando conforme encuentre pixeles que no sean como el fondo y que sean contiguos; así, guarda un cromosoma en cada tabla.

Código PHP:
<?php
/**
 * Analiza imágenes de cromosomas en metafase
 * @author Héctor Valverde Pareja
 * @version 1
 * @package Cariotipo
 * http://www.forosdelweb.com/f18/buscar-similitudes-entre-imagenes-580893
*/

    
define('_DATA_BASE','cariotipo');
    
define('_USER','root');
    
define('_PASSWORD','');
    
define('_HOST','localhost');

    
define('_ERROR_FONDO',10);
    
define('_SENS_IMG',4);

class 
Cariotipo{

        function 
init($imagen){
        
            
/**
            / Crea la imagen con la que vamos a trabajar
            / Determina el color de fondo
            / Determina el tamaño de la imagen
            / Conecta con la base de datos
            */
                
                
if(empty($imagen)){
                    exit(
"<b>Error Cariotipo:</b> La imagen no ha sido definida<br>");
                }elseif(!
file_exists($imagen)){
                    exit(
"<b>Error Cariotipo:</b> No se ha encontrado el archivo especificado<br>");
                }
                
            
$this->connection mysql_connect(_HOST,_USER,_PASSWORD);
            
mysql_select_db(_DATA_BASE$this->connection) or die("<b>Error Cariotipo:</b> No se ha podido conectar con la base de datos");
            
            
$size_array getimagesize($imagen);
            
            
$this->xsize $size_array[0];
            
$this->ysize $size_array[1];
            
            
$this->color_fondo($imagen);    
            
$this->im imagecreatefrompng($imagen);
            
            unset(
$size_array);
        
        }

        function 
pixel($x,$y){
        
            
/**
            / Propiedades de un pixel localizado en (x,y)
            */
        
            
$this->$x;
            
$this->$y;
            
$this->color imagecolorat($this->im,$x,$y);
            
            if(
$this->es_fondo($this->color)){
    
                
$this->mode "F";
            
            }else{
            
                
$this->mode "R";
            
            }
            
        }

        
    function 
color_fondo($imagen){
    
        
/**
        / Determina el color de fondo
        / Se basa en el color más abundante
        / En desarrollo, hacerlo con un solo cuadrante para no saturar la memoria
        */
        
        
        
$s getimagesize($imagen);
        
        
$w $s[0];
        
$h $s[1];
    
        
$im imagecreatefrompng($imagen);
        
        for(
$y=0;$y<$h;$y++){
        
            for(
$x=0;$x<$w;$x++){
            
                
$color_pix[] = imagecolorat($im,$x,$y);
                
            }
            
        }
        
        
imagedestroy($im);
        
        
$count array_count_values($color_pix); //Crea una matriz ( valor -> frecuencia )
        
        
$colors array_keys($count);             //Saca el nombre de cada valor (el color)
    
        
$fondo $colors[0];
        
        unset(
$count,$colors,$color_pix);
        
        
$this->fondo $fondo;
        
    }
    
    function 
es_fondo($color){
        
        
/**
        / Comprueba si el pixel es del color de fondo
        / Devuelve false si no es fondo
        */
        
        
$fondo $this->fondo;
        
        if(
$color $fondo _ERROR_FONDO || $color $fondo _ERROR_FONDO){
            return 
false;
        }else{
            return 
true;
        }
    }
    
    
    public function 
dibuja_text(){
    
        
/**
        / Dibuja la imagen en texto
        */
        
        
$imagen $this->imagen;
        
        
$this->init($imagen);
        
        
$fondo $this->fondo;
        
        for(
$y=0;$y<$this->ysize;$y++){
            
            for(
$x=0;$x<$this->xsize;$x++){
            
                
//imagesetpixel($this->im,$x,$y,$this->fondo);
            
                
$this->pixel($x,$y);
                
                
$hex sprintf("%06X",$this->color);
                
                echo(
"<font color = '#$hex'>X</font>");
                
            }
            
            echo(
"<br>");
            
        }
                    
    }
    
    public function 
print_fondo(){
    
        
/**
        / Imprime el color de fondo
        */
    
        
$this->init($this->imagen);
        
        echo(
"Color de fondo: ".$this->fondo."<br>");
    
    }
    
    function 
save_cromosoma(){
    
        
/**
        / Escanea y guarda pixeles adyacentes que no sean R o F
        / Se decide a posteriori si la tabla creada se trata de 
        / un cromosoma o no, segun condiciones
        */
        
        
if(!isset($this->count_crom)){
        
            
$i 1;
            
$this->count_crom 1;
        
        }else{
        
            
$i $this->count_crom;
        
        }
        
        
$this->tabla "car_crom_$i";
        
        
$sql "CREATE TABLE $this->tabla(x INT NOT NULL,y INT NOT NULL,c INT NOT NULL) ENGINE = MYISAM";
        
        
mysql_query($sql,$this->connection);
        
        
$this->count_crom++;
        
    }
    
    function 
save_pixel($x,$y){
            
        
/**
        / Ejecución con mysql que guarda el pixel en una tabla dada
        */
            
        
$color imagecolorat($this->im,$x,$y);
        
$tabla $this->tabla;
        
        
$sql "insert into $tabla (x,y,c) values('$x','$y','$color')";
        
        
mysql_query($sql,$this->connection);
        
        unset(
$sql);
        
    }
    
    public function 
reconocer(){
    
        
/**
        / Función que escanea la imagen
        / Genera las listas asociadas
        / y llama a save_cromosoma por cada lista
        / así guarda un cromosoma en cada tabla
        */
        
        
$imagen $this->imagen;
        
        
$this->init($imagen);
        
        
$fondo $this->fondo;
        
        for(
$y=0;$y<$this->ysize;$y++){
            
            for(
$x=0;$x<$this->xsize;$x++){
        
                if(!
$this->es_fondo(imagecolorat($this->im,$x,$y))){
                
                    
//$this->save_cromosoma(); // Crea la tabla
                    
$this->_cr_arbol($x,$y); // Guarda los pixeles contiguos
                
                
}
        
            }
            
            echo(
"::FIN<br>");
            
        }
                    
    }
    
    public function 
cuantos_cr(){
    
        
/**
        / Cuenta las tablas que hay en la base de datos
        / En desarrollo, devuelve el número de tablas que 
        / cumplen las propiedades de un cromosoma
        */
        
        
$sql "SHOW TABLES";
        
        
$rs mysql_query($sql$this->connection);
        
        
$num mysql_num_rows($rs);
        
        if(
$num == 0){
        
            echo(
"<b>Error Cariotipo: </b>No hay cromosomas en la imagen o no se ha ejecutado el método <b>Cariotipo::reconocer()</b><br>");
        
        }else{
        
            echo(
"Número de cromosomas: $num");
        
        }
    
    }
    

    
        
/**
        / -----------------------------------------------------------
        / Funcones proporcionadas por: GatorV de forosdelweb.com:
        / http://www.forosdelweb.com/f68/listas-enlazadas-php-582740/
        / Optimizadas por Héctor Valverde Pareja para "cariotipo"
        / -----------------------------------------------------------
        */
        
               
function _cr_arbol($x,$y) {
                 
                         
$li = new Node();
                         
                         
//$this->save_pixel($x,$y);
                         
                         
imagesetpixel($this->im,$x,$y,$this->fondo); echo("r");
                
/*         
                $li->izda   = $this->es_fondo(imagecolorat($this->im,$x-1,$y)); if(!$li->izda && $x-1>0 && $y>0) { $this->_cr_arbol($x-1,$y); }
                $li->dcha   = $this->es_fondo(imagecolorat($this->im,$x+1,$y)); if(!$li->dcha && $x+1>0 && $y>0) { $this->_cr_arbol($x+1,$y); }
                $li->arriba = $this->es_fondo(imagecolorat($this->im,$x,$y-1)); if(!$li->arriba && $x>0 && $y-1>0) { $this->_cr_arbol($x,$y-1); }
                $li->abajo  = $this->es_fondo(imagecolorat($this->im,$x,$y+1)); if(!$li->abajo && $x>0 && $y+1>0) { $this->_cr_arbol($x,$y+1); }
                    */
                    
                    
unset($li);
        
               }

}
class 
Node {

       public 
$izda;
       public 
$dcha;
       public 
$arriba;
       public 
$abajo;
       
}
?>
__________________
El mejor maestro es el eterno aprendiz.
http://hvpareja.wordpress.com/

Última edición por hvpareja; 05/05/2008 a las 09:05
  #14 (permalink)  
Antiguo 05/05/2008, 09:50
Avatar de hvpareja  
Fecha de Ingreso: marzo-2007
Ubicación: En Vélez Málaga (Málaga)
Mensajes: 213
Antigüedad: 17 años, 1 mes
Puntos: 4
Re: Buscar similitudes entre imágenes

Hay líneas del código que están comentadas, eso se debe a que está en desarrollo y estaba probando cosillas en ese momento... si realmente tienes interés no encontrarás muchos problemas a la hora de interpretar la clase, considero que está medianamente bien explicada con los comentarios.

Sigo trabajando en esto, no lo dejo, dadme ánimos!!
__________________
El mejor maestro es el eterno aprendiz.
http://hvpareja.wordpress.com/
  #15 (permalink)  
Antiguo 05/05/2008, 10:59
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Re: Buscar similitudes entre imágenes

Hola hvpareja,

Muy interesante tu proyecto, sin embargo creo que en tu código que estas realizando deberías de modularizar más y separar más, es decir tener una clase base para el manejo de la imagen, otra clase que se encargue de analizar la imagen, y una ultima que lo almacene en la base de datos.

Igual lo que podrías hacer es transformar la imagen primeramente. Me refiero a crear por ejemplo primero de esa imagen borrosa, aplicarle filtros para hacerla mas nítida (aunque se pierda la calidad), posteriormente ya que la tengas casi en dos colores (blanco y negro), entonces empiezas a meter todo en una matriz.

Esta matriz la llenas en posición 0 = fondo, 1 = negro, para posteriormente crear un algoritmo que vaya buscando las posiciones y entonces hacer el reconocimiento de que tipo de cromosoma es.

Espero con esto darte una idea de como hacer el tratamiento de la imagen de una forma mas optima y sencilla.

Saludos.
  #16 (permalink)  
Antiguo 05/05/2008, 11:46
Avatar de hvpareja  
Fecha de Ingreso: marzo-2007
Ubicación: En Vélez Málaga (Málaga)
Mensajes: 213
Antigüedad: 17 años, 1 mes
Puntos: 4
Re: Buscar similitudes entre imágenes

Tu respuesta no solo constituye una idea para seguir avanzando en el proyecto sino que me ayuda a organizar mis códigos de aquí en adelante, es justamente lo que necesitaba.

No tengo acceso a clases magistrales de programación, por ahora, por que me dedico a la biología, un consejo como el tuyo se agradece bastante, da por hecho que trabajaré en ello.

Muchas gracias.
__________________
El mejor maestro es el eterno aprendiz.
http://hvpareja.wordpress.com/
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 20:13.