• Publicidad

Detectar número de figuras

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Detectar número de figuras

Notapor Zeokat » 2008-08-06 18:17 @804

Bien, tengo una imagen como la siguiente: Imagen

¡Ojo! en la imagen de ejemplo hay 3 figuras, pero podría haber más o menos.

Necesito separar las figuras, cada una en una imagen diferente.

Tengo una idea de cómo podría hacerlo. Quizás leyendo los píxeles según lineas verticales y en la primera aparición de un píxel "no blanco" será el principio de la primera figura.

Mientras estoy sobre la figura (al ir escaneado los píxeles en líneas verticales) siempre habrá algún píxel "no blanco" y sabré que llego al final de la primera figura con la primera línea vertical que tenga en su totalidad píxeles "blancos"... y esto tendría que hacerlo tantas veces como fuese necesario para saber dónde empieza y termina cada figura.

No sé cómo meterle mano a este problema, a ver si alguien se le ocurre una solución.

De momento sólo tengo lo siguiente:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl -w
use strict;
use GD;

my $file = $ARGV[0];
chomp($file);

GD::Image->trueColor(1);
my $image = newFromJpeg GD::Image($file);
(my $width, my $height) = $image->getBounds();

for my $i ( 0 .. $width-1 ) {
    for my $j (0 .. $height-1) {
        my $index = $image->getPixel($i,$j);
        if ($index != 16777215) { #Si el pixel no es blanco

...................... # No se como seguir...
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Gracias de antemano.
Zeokat
Perlero nuevo
Perlero nuevo
 
Mensajes: 125
Registrado: 2006-08-22 08:08 @380

Publicidad

Notapor explorer » 2008-08-06 19:23 @849

Vas muy bien... solo necesitas una bandera que indique cuándo estás en una zona blanca y cuándo en una figura. Y un contador que sume las veces que pasen de uno a otro (pero no de otro a uno).
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14482
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor Zeokat » 2008-08-06 20:15 @885

Mmm... creo que me he explicado mal, el título da lugar a confusión.

Necesito saber cuántas figuras hay, pero al mismo tiempo necesito separar cada figura en una imagen diferente, por lo que he de conocer la coordenada $i donde empieza cada figura y la coordenada $i donde termina y luego ir copiando entre esos dos valores y pegando en una nueva imagen.

El problema está en obtener las coordenadas principio-fin de cada figura.

Y por supuesto ya que estoy saber el número de figuras.

Llevo ahí bloqueado bastante tiempo, lo de obtener esas coordenadas me ha levantado un ligero dolor de cabeza, jeje, mañana recién levantado vuelvo a indagar porque ahora estoy bloqueado.
Zeokat
Perlero nuevo
Perlero nuevo
 
Mensajes: 125
Registrado: 2006-08-22 08:08 @380

Notapor explorer » 2008-08-07 10:06 @462

Ya lo he hecho: he 'aplanado' la imagen: por cada columna veo si tienen algún píxel negro. Si lo tiene, la marco como '1' y si no, como '0'. Finalmente, solo hay que contar los tramos de '1' (que son las columnas con figura). Las coordenadas de inicio y fin de figura son fáciles de sacar.

Naturalmente, solo es válido si las figuras están 'separadas' por al menos una columna.

Seguro que hay más formas de hacerlo.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14482
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor Zeokat » 2008-08-07 12:17 @553

Sé que lo que tengo que hacer es ir leyendo por columnas la imagen, ahí está mi problema... ¿cómo?, sé que cuando $j = $height-1, habrá finalizado la columna.

He probado cosas pero sin éxito, no consigo leer columna a columna. :(
Zeokat
Perlero nuevo
Perlero nuevo
 
Mensajes: 125
Registrado: 2006-08-22 08:08 @380

Notapor explorer » 2008-08-07 12:44 @572

Pero si el doble bucle for que has escrito antes sí que lo hace...

Variando $i y $j estás mirando todos los píxeles. Como el bucle interior es el $j, getPixel() está recorriendo toda la columna, para cada fila.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14482
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor Zeokat » 2008-08-07 13:46 @615

Sí, sí, sí, eso ya lo tenía en cuenta y de hecho hasta lo comprobé pintando las $i y las $j.

Bueno lo único que consigo es obtener los valores de $i en los que hay píxeles "no blancos", pero sigo sin conseguir mi objetivo.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my @x_no;
for my $i ( 0 .. $width-1 ) {
    for my $j (0 .. $height-1) {
        my $index = $image->getPixel($i,$j);
        if ($index != 16777215 && $i != $x_no[$#x_no]) {
            push (@x_no, $i);
        }
    }
}

#Comprobacion
foreach my $elemento(@x_no) {
    print "$elemento\n";
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Zeokat
Perlero nuevo
Perlero nuevo
 
Mensajes: 125
Registrado: 2006-08-22 08:08 @380

Notapor explorer » 2008-08-07 15:02 @668

Necesitas meter 'más información' dentro del bucle.

Esta es una posible solución, aunque no es muy sencilla.

- Actualización: Programa eliminado porque tenía errores. Buscar siguiente versión más abajo -

La salida es
Código: Seleccionar todo
explorer@casa:~/Documents/Desarrollo> ./kk.pl ejemploai5.jpg
000000111111111111110000000000000000011111111111111100000000000000011111111111111000000000
000000000011111111112222222222333333333344444444445555555555666666666677777777778888888888
012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
Hay 3 figuras
Posición inicial: 6
Posición inicial: 37
Posición inicial: 67
Posición final: 19
Posición final: 51
Posición final: 80


Actualización: Expresiones regulares más sencillas.
Actualización: Se descubrió que había un fallo en el caso de que existiese una figura en la última columna. La solución fue añadir un '0' al final y simplificar aún más la segunda regex.
Última edición por explorer el 2008-08-08 12:11 @549, editado 4 veces en total
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14482
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor Zeokat » 2008-08-07 16:06 @712

Madre mía, explorer, ahora entiendo porqué no daba con la solución. En este código hay cosas nuevas para mi.

Voy a analizarlo línea a línea con calma para entenderlo al 100%.

Gracias de nuevo, explorer... o quizás San explorer, te tendré que hacer un monumento cuando termine la carrera :P

Saludos.
Zeokat
Perlero nuevo
Perlero nuevo
 
Mensajes: 125
Registrado: 2006-08-22 08:08 @380

Notapor explorer » 2008-08-07 16:20 @722

Esa solo es una de las múltiples formas de solucionarlo... tu vas muy bien con tu propia solución. Hay muchas más...
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14482
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Siguiente

Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron