PDA

Ver la Versión Completa : Transformada de Hough


Luciano Pache
22-10-2008, 03:04:05
Hola a todos, veo que este foros puede ayudarme con un trabajo en la uni, conste que e visto algunos asuntos que trata de procesamiento de imagenes, estoy aprendiendo a trabajar con delphi, y tengo que desarrollar la transformada de Hough em pascal para aplicar en una imagen que esta en un Timage, la imagen es de tipo Bitmap. La transformada de Hough consiste en detectar objetos circulares en una imagen.

Transformada de Hough
Esta es una técnica que permite descubrir formas en una imagen. Se basa en transformar puntos de la imagen en un espacio de parámetros. La idea es encontrar curvas parametrizabales como rectas, círculos y polinomiales. En teoría se pueden encontrar formas más complejas pero el costo computacional crece rápidamente. Generalmente se realiza detección de bordes a la imagen, y luego se aplica la transformada a esta. De esta forma son menos los puntos que hay que recorrer y por lo tanto mas rápido es el algoritmo. El más usado para realizar la detección de bordes es el Filtro de Canny.
Ejemplo: Deteccion de retas
Detección de círculos:
La ecuación del circulo tiene tres parámetros ( dos para el centro del círculo, uno para el radio). Por lo tanto el espacio de parámetros esta forma es de dimensión tres. Esto dificulta el algoritmo, recorrer un espacio de dimensión dos, y encontrar máximos en espacio de dimensión tres.

E encontrado algo en la internet pero como esti comenzando a programar en delphi necesitava de la ayuda de alguien mas experiente, esto lo q tengo a mano

Hi,

Its actually very simple,

You have two known variables x,y and two unknown , r and theta.

You do:

// For all rows in image.
for y:=0 to ImageHeight-1 do
begin

// For all pixel in one row.
for x:=0 to ImageWidth-1 do
begin

// Is there a point there or not. If not, just skip the pixel.
if IsPoint[x,y] then
begin
// Now you need to iterate for one of the unknown variables,
// theta, to be able to determine the other unknown, r.
for theta:=0 to 360-1 do
begin
r:=x*cos(theta*PI/360) + y*sin(theta*PI/360);

// Plot the finding (theta,r) into an array.
// Ignore negative values... trust me... its ok!
if r>=0 then Inc(HoughArray[theta,r]);
end;
end;
end;
end;

The size of the array can be calculated as:
HoughArray:Array [MaxTheta,MaxR] of integer;
where MaxTheta due to the loop naturally is 360 (we determine that
ourselves)
and MaxR=Sqrt(ImageHeight*ImageHeight + ImageWidth*ImageWidth)

/--------------------------
MaxR= / 2 2
/ ImageHeight + ImageWidth
V


Si alguien pude ayudarme estoy muy agradecido!!

Delphius
22-10-2008, 03:24:48
Hola Luciano Pache,
Bienvenido a clubdelphi.

Por favor no repitas hilos, he encontrado un duplicado de éste aqui (http://www.clubdelphi.com/foros/showthread.php?t=61010). Esto constituye a una violación de la guia de estilo (http://www.clubdelphi.com/foros/guiaestilo.php), y por ello te recomiendo que te tomes unos minutos para leerla.

Con respecto a tu duda, ¿podrías indicarnos al menos la fuente a la que consultaste?

Saludos,

coso
22-10-2008, 14:32:12
Hola, segun lo que he entendido (wikipedia (http://es.wikipedia.org/wiki/Transformada_de_Hough)) tendrias que :

-recorrer cada punto de la imagen
-si se encuentra un punto, entonces recorrer cada phi (0 a maxr),ro (0 a 360) y si se encuentra otro punto guardar en el array el phi,ro, correspondiente, donde phi seria un radio y ro un angulo. Esto seria ir recorriendo primero un circulo de radio 1 alrededor del pixel, luego de radio 2, etc.. asi hasta maxr que seria el tamaño máximo de la imagen.
-una vez se tienen recorridos todos los pixeles, mirar que valores de phi,r son los que se han guardado y analizarlos. Si por ejemplo las phi guardadas cambian pero las ros son mas o menos constantes, entonces es una recta (radio variable, pero siempre el mismo angulo). Si por ejemplo, las phis guardadas mas o menos no cambian pero las ros si, entonces es un arco de circulo (radio constante, angulo de 15 a 60, por ejemplo). Si las phis guardadas mas o menos no cambian y las ros van de 0 a 360, entonces tienes un circulo completo. Supongo que para encontrar elipses o rectangulos ya sera mas complicado :confused:. Bueno, a ver si te sirve.
De todas maneras yo buscaria mas información antes de ponerme a programarlo. Saludos.