PDA

Ver la Versión Completa : reconocimiento de imagenes


the darkness
04-05-2004, 20:12:43
saludos a todos.
la presente la mando para solicitar su ayuda, ya que intento hacer un proyecto donde a partir de una imagen, foto, bitmap, etc. pueda encontrar en el ciertas caracteristicas, es decir esta imagen solo cuenta con un color aparente de fondo y puentos negros de distintos tamaños, pero que no difieren mucho, la cuestion es poder a partir de delphi contar dichos puntos negros y sacar un total.
esto es posible??, yo creo que si, pero no tengo idea de como, se que es tratamiento de imagenes, por esto acudo a ustedes.
de antemano muchas gracias.

Lic. Eduardo Maldonado

delphi.com.ar
04-05-2004, 20:19:59
Si es posible, he visto un sistema de una tesis universitaria, que reconocía personas. Lo habían hecho creando imágenes tridimensionales a partir de una imagen en 2D.
No son sistemas sencillos, te recomiendo buscar buena bibliografía para poder encarar un proyecto de este tipo.

Saludos!

jachguate
04-05-2004, 20:24:36
Creo que es algo relativamente sencillo para quien tenga experiencia con imágenes. Al fin de cuentas, un punto negro (del tamaño que sea) es una secuencia de pixels de color negro.

Haciendo un barrido del bitmap, al encontrar el primer pixel de color negro se asume que has entrado a un nuevo punto, vez se halla el primer pixel de otro color, pues has salido del punto. Habrá que tener algo de ingenio. Si no has trabajado manipulando imágenes, es buena idea que primero te empapes bien de los formatos y tecnicas aplicables (aunque he dicho que, desde mi punto de vista, basta con un barrido), y que tengas ingenio para no duplicar los puntos que tengan una altura de mas de un pixel.

Hasta luego.

;)

Amilius
04-05-2004, 23:53:51
saludos a todos.
la presente la mando para solicitar su ayuda, ya que intento hacer un proyecto donde a partir de una imagen, foto, bitmap, etc. pueda encontrar en el ciertas caracteristicas, es decir esta imagen solo cuenta con un color aparente de fondo y puentos negros de distintos tamaños, pero que no difieren mucho, la cuestion es poder a partir de delphi contar dichos puntos negros y sacar un total.
esto es posible??, yo creo que si, pero no tengo idea de como, se que es tratamiento de imagenes, por esto acudo a ustedes.
de antemano muchas gracias.

Lic. Eduardo Maldonado
Puntos o manchas?

Tu pregunta tiene que estar mejor detallada, no dices casi nada:

- Profundidad de color de la imagen? Es más fácil si la imagen original sólo tiene 1 bit de profundidad y los puntos no están intersectados. ¿El tamaño de los puntos es uniforme, es un pixel?
- Resolución?
- Aplicación práctica?

Es posible, vi ese sistema y es un módulo de otro sistema mayor que clasifica muestras de DNA y puede determinar incluso si existen enfermedades genéticas. Aplica lo último en redes neuronales, pero primero ubica cada mancha, la mide, la clasifica, la cuantifica y recién aplica la clasificación a TODA la muestra de manchas.

the darkness
06-05-2004, 02:05:37
pues si, si fue muy parca mi explicación, lo pondre de esta manera, esta imagen no es mas que una fotografia tomada por un microscopio electrónico, que presenta unicamente la imagen en un color crema muy claro y una especie de red un poco mas luminosa, dichas rayas que forman tal malla son de un color mucho mas claro que lo demás y sirve para identificar las areas a comparar, ahora bien, esta imagen cuenta con puntos negros muy pequeños, a los cuales no se nota una diferencia entre una y otra, no creo que cuente con profundidad no colores encimados ni nda por el estilo.
espero que esto este mejor explicado.
de antemano muchas gracias.
Eduardo Maldonado

roman
06-05-2004, 04:01:06
Al fin de cuentas, un punto negro (del tamaño que sea) es una secuencia de pixels de color negro.


¿Podrías explicar a qué te refieres con esto? :confused:

// Saludos

jachguate
06-05-2004, 04:07:22
¿Podrías explicar a qué te refieres con esto? :confused:

// Saludos

vamos... supongamos que yo estoy viendo 1 a 1 los pixels que forman la imagen (que es una matriz de n x m pixels). En una imagen un punto negro será una secuencia de pixels negros... en otras palabras será 1 o mas pixels de color negro dispuestos continuamente sobre la imagen.

Si yo barro la imágen de izquierda a derecha... y hay un punto de los pixels de la columna 7 a la columna 14 de la fila 1, se da por sentado que las columnas 8, 9, 10, 11, 12 y 13 también serán pixels negros.

Mencionaba que para "puntos" con mas de un pixel de alto, habrá que idear un mecanismo para reconocer, en la fila 2 (continuando con el ejemplo) que los pixels de la columna 6 a 14 (nota el cambio de la columna inicial) pertenecen siempre al mismo punto ya contado. No es algo complicado.

Hasta luego.

;)

jachguate
06-05-2004, 04:12:26
Otro asunto es que los pixels que componen el punto sean realmente "negros"... si no, habrá que idear un mecanismo de "tolerancia" para incluir grises u otros colores obscuros
o bien un algoritmo para hacer primero una copia de la imagen en blanco y negro y trabajar sobre ella

hasta luego.

;)

the darkness
06-05-2004, 19:30:15
o.k. muchas gracias por sus respuestas, y jachguate, me queda claro lo que me pides que haga, pero la verdad, estoy en cero referente al tratamiento de imagenesa, por tanto me estoy poniendo a investigar bastante, pero me suena logico lo que mencionas, solo te pido un favro, como puedo hacer dicho barrido y sobre que lo comparo. por que se prodria decir que verificar pixel por pixel y se comparara con colores especificos.
espero y me ayudes.
gracias

jachguate
06-05-2004, 20:02:47
si la imagen la cargas en un Bitmap, podes acceder a los pixels asi valiendote de su propiedad canvas.pixels, que es un array de 0 a width - 1, y de 0 a height - 1 de TColor.

Hasta luego.

;)

Amilius
07-05-2004, 03:22:38
La verdad que es un sistema complejo (toda una tesis) y es muy difícil que puedas encontrar un módulo listo para contar manchas de una imagen.

Por la descripción del tipo de imagen diría que lo ideal es tratarla como escala de grises (8bits de profundidad de color, lo que da 256 niveles de gris que van de 0 a 255).

Tengo una idea simple para solucionar el problema:
cada punto vale de 0 a 255:
0=negro ,255=blanco

Eliges un punto al azar de la imagen que no esté revisado, si es más bajo que cierto umbral vas marcando esa zona en espiral (como revisado) hasta que los pixeles tengan valor más alto que otro umbral. Cuentas como 1 mancha y mides su tamaño de acuerdo al área que pintaste antes de decidir que los pixeles restantes no formaban parte de la mancha. Continuas este proceso hasta que no existan áreas de la imagen no marcadas como "revisadas".

Esto servirá si y sólo si: las manchas son circulares, la mancha más pequeña tiene un buen tamaño en pixeles, tienen buen contraste y el contraste entre manchas y fondo es constante y el fondo es también de matiz constante.

Para dar mayor potencia a un sistema de tratamiento de imágenes te recomiendo investigar algunas herramientas matemáticas como el análisis wavelet, ideal para imágenes, que permiten analizar la imagen a varias escalas y permiten realizar detección de bordes también a varias escalas, lo que también es util para eliminar frecuencias muy bajas de la imagen (gradientes en el fondo) para mejorar los resultados.

=P

Creo que escribi demasiado...

P.D.

Esto es para los que alguna vez intentaron hacer algo con "Pixels" y vieron que era muuuuuuuy lento:


/*
Esto es muchísimo más rápido que usar Pixels[x,y] (Realmente mucho más rápido), pero también más complicado y PELIGROSO, no vayan a escribir fuera del area de memoria de su bitmap!!.

OJO que el bitmap va de 0 a Height-1 y de 0 a width-1, no se salgan de límites !!
*/
//Tipos necesarios
PuntoRGB=array[0..2] of byte;
TlineaRGB=array[0..MAX_LINEA] of PuntoRGB;
PlineaRGB=^TlineaRGB;

//OJO que:
CImagen = class(TBitmap)

//(Aplica un "blur" en dos pasadas a un bitmap de 24bits de profundidad de color)

//Esto está implementado a manera de incluir un método adicional:

procedure CImagen.Suavizar();
var i,j,k:integer;
rgb1,rgb2,rgb3:PlineaRGB;
begin
for j:=2 to Height-1 do
begin
rgb1:=ScanLine[j-2];
rgb2:=ScanLine[j-1];
rgb3:=ScanLine[j];
for i:=0 to width-1 do
for k:=0 to 2 do //colores
rgb2[i,k]:=(rgb1[i,k]+rgb2[i,k] shl 1+rgb3[i,k]+3) shr 2;
end;
for j:=0 to Height-1 do
begin
rgb1:=ScanLine[j];
for i:=2 to width-1 do
for k:=0 to 2 do //colores
rgb1[i-1,k]:=(rgb1[i-2,k]+rgb1[i-1,k] shl 1+rgb1[i,k]+3) shr 2;//interpolar
end;
end;