Ver Mensaje Individual
  #13 (permalink)  
Antiguo 05/05/2008, 08:58
Avatar de hvpareja
hvpareja
 
Fecha de Ingreso: marzo-2007
Ubicación: En Vélez Málaga (Málaga)
Mensajes: 213
Antigüedad: 17 años, 2 meses
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