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 = $x;
$this->y = $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;
}
?>