Está en la página 1de 46

DESCRIPCIN DE FORMAS Y CONTORNOS

Luis Enrique Coronado Zuiga


Facultad de Ingeniera
UASLP

INTRODUCCIN

Descripcin de una imagen: extraer propiedades o


atributos de un objeto para su uso en aplicaciones.
Los descriptores deben ser deben:

Ser independientes del tamao, la localizacin y orientacin


del objeto.
Contener suficiente informacin de discriminacin para
distinguir un objeto de otro.

Descriptores de borde: rectas, curvas, etc.


Descriptores de regiones: color, textura, nivel medio de
intensidad etc.

ESQUEMAS DE REPRESENTACIN
Las tcnicas de segmentacin producen datos en bruto
en forma de pixeles de contorno o de una regin.
Normalmente se utilizan esquemas que compacten los
datos en representaciones ms tiles en el clculo de
descriptores.
Esquemas de representacin comunes:

Cdigos cadena
Aproximaciones poligonales

CDIGOS CADENA
Los cdigos cadena se utilizan para representar un
contorno por medio de una secesin conexa de
segmentos de longitud y direccin especificadas.
Normalmente se basa en segmentos de conectividad 4 u
8.
La direccin de cada segmento se codifica utilizando un
esquema de numeracin.
Los cdigos cadena se crean siguiendo un contorno en
una direccin (ej. en sentido de la manecillas del reloj)

CDIGOS CADENA

Conectividad 4

Conectividad 8

CDIGOS CADENA
Regularmente para generar cdigos cadena se vuelve a
muestrear el contorno seleccionando un espacio de
cuadricula mayor.
Se asigna un punto del contorno a cada nodo del
cuadriculado.

CDIGOS CADENA

Se recorre el contorno, asignndole su cdigo cadena


correspondiente.

Conectividad 4

Conectividad 8

APROXIMACIONES POLIGONALES

El objetivo de una aproximacin poligonal es captar la


esencia de la forma del contorno con un polgono del
menor nmero de lados posibles.

APROXIMACIONES POLIGONALES

Mtodo para dividir los lados de un contorno de


Douglas-Peucker (DP):
Se encuentran los dos puntos extremos del borde y se crea
una lnea que los conecta.
Se busca el punto del contorno ms alejado de la lnea
creada en el paso anterior.

APROXIMACIONES POLIGONALES

El punto encontrado en el paso anterior se aade a la


aproximacin poligonal
El proceso se repite hasta que la distancia ms alejada de las
lneas de la aproximacin poligonal al contorno sea menor a
una constante.

10

CONTORNOS EN OPENCV
OpenCV cuenta con una funcin para encontrar los
contornos de una imagen.
Sin embargo antes de utilizarla se debe conocer lo
siguiente:

Direccionamiento de memoria dinmica en OpenCV


Secuencias en OpenCV

11

DIRECCIONAMIENTO DE MEMORIA DINMICA EN


OPENCV

OpenCV utiliza la estructura CvMemStorage para almacenar


memoria de objetos dinmicos.
Para crear un nueva memoria CvMemStorage se utiliza el
mtodo cvCreateMemStorage().

CvMemStorage*
0);

cvCreateMemStorage(

int

block_size

block_size indica el tamao de los bloque de memoria.


Si es puesto en 0, el tamao del bloque ser de 64kB.

Para liberar la memoria de un objeto CvMemStorage, se


utiliza el siguiente mtodo:

void cvReleaseMemStorage(CvMemStorage ** storage);


12

SECUENCIAS:

Las secuencias son listas doblemente enlazadas de diferentes


tipos de objetos utilizados por funciones de OpenCV.
Algunos elementos de la estructura que representa las
secuencias en OpenCV son las siguientes.

typedef struct CvSeq {


CvSeq* h_prev; // secuencia previa
CvSeq* h_next; // prxima secuencia
CvSeq* v_prev; // segunda secuencia previa
CvSeq* v_next; // segunda secuencia prxima
int total;

// nmero de elementos en la
secuencia

13

ENCONTRAR CONTORNOS EN OPENCV


Un contorno es una lista de puntos que representan una
curva en una imagen.
La funcin cvFindContours() calcula los contornos de
imgenes binarias.

Utiliza imgenes creadas por algn algoritmo de deteccin


de bordes o por regiones creadas por funciones como
cvThreshold() .
El resultado es una secuencia del tipo CvSeq que contiene los
contornos encontrados.
Cada contorno encontrado es la vez una secuencia del tipo
CvSeq que contiene los puntos del contorno encontrado

14

ENCONTRAR CONTORNOS EN OPENCV

cvFindContours() distingue entre dos tipos de contornos


exteriores (c) y contornos interiores o huecos (h).

15

ENCONTRAR CONTORNOS EN OPENCV


int cvFindContours(
IplImage * img,
CvMemStorage* storage,
CvSeq** firstCountour,
int headerSize,
CvContourRetrievalMode mode;
CvChainApproxMethod method;
);
1.

2.

(1)
(2)
(3)
(4)
(5)
(6)

Imagen de entrada de 8 bits y un canal. Esta imagen tambin es


usada como salida.
Memoria del tipo CvMemStorage.
16

ENCONTRAR CONTORNOS EN OPENCV


3.

Puntero a una secuencia CvSeq . Se puede inicializar


como nula una secuencia y despus utilizarse en la
funcin como en el siguiente ejemplo:
CvSeq* firstContour = NULL;

cvFindContours( ..., &firstContour, ... );


4.

Depende del valor del ltimo argumento method y


puede tener el valor de sizeof(CvContour) o
sizeof(CvChain) (solo cuando el mtodo de
representacin es CV_CHAIN_CODE).

17

ENCONTRAR CONTORNOS EN OPENCV


5.

Existen cuatro topologas posibles:

CV_RETR_EXTERNAL : Recupera nicamente los contornos exteriores

18

ENCONTRAR CONTORNOS EN OPENCV


CV_RETR_LIST : Recupera todos los contornos y los pone en una lista.

19

ENCONTRAR CONTORNOS EN OPENCV


CV_RETR_CCOMP : Recupera todos los contornos y los organiza en
una jerarqua de dos niveles.

20

ENCONTRAR CONTORNOS EN OPENCV


CV_RETR_TREE : Recupera todos los contornos y reconstruye la
jerarqua de los contornos anidados por niveles

21

ENCONTRAR CONTORNOS EN OPENCV


6.

Define el mtodo de cmo los contornos son


representados.
CV_CHAIN_CODE: los contornos se representarn en cdigo
cadena.
CV_CHAIN_APPROX_NONE: se traducen todas las partes del
cdigo cadena a puntos.

El valor de retorno de cvFindContours() es el nmero total de los


contornos encontrados.

22

DIBUJAR CONTORNOS
void cvDrawContours(
CvArr* img,

//Imagen de salida

CvSeq* contour,

//Contornos

CvScalar external_color,

//Color de contornos

CvScalar hole_color,

//Color de huecos

int max_level,

//Nivel del rbol

int thickness = 1,

//Delgadez del contorno

int line_type = 8,

//Tipo de lnea

CvPoint offset = cvPoint(0,0)


);

23

ENCONTRAR CONTORNOS EN OPENCV

Ejemplo:
Cvseq* contornos = 0;
CvMemStorage* storage = cvCreateMemStorage(0);
cvFindContours( imagen_gris, storage, &contornos,

sizeof(CvContour), CV_RETR_TREE,
CV_CHAIN_CODE, cvPoint(0,0) );
cvDrawContours( imagen_color, contornos,
CV_RGB(255,0,0),
CV_RGB(0,255,0),1, 2, 2,
cvPoint(0,0) );
cvReleaseMemStorage( &storage );
24

APROXIMACIONES POLIGONALES EN OPENCV


CvSeq* cvApproxPoly(
const void* src_seq,
//Contorno CvSeq
int header_size,
//Tamao
CvMemStorage* storage,
// Memoria dinmica
int method,
//Mtodo de aproximacin
double parameter1, //Precisin
int recursive = 1
);
Ejemplo:
contornos = cvApproxPoly( contornos,
sizeof(CvContour), storage,
CV_POLY_APPROX_DP, 3, 1 );
25

DESCRIPTORES DEL CONTORNO.

Permetro: nmero de pixeles a lo largo del contorno. La


distancia entre pixeles en diagonal se suele tomar como
2 1,4142
Ejemplo en OpenCV:
int p = cvContourPerimeter(contorno);

26

DESCRIPTORES DEL CONTORNO: PERMETRO


rea:

nmero de pixeles dentro de un contorno.

, = 1 si el pixel forma parte del objeto.


, = 0 si el pixel forma parte del fondo.
El rea es el nmero de pixeles para los cuales , = 1 , es
decir:

(, )
=1 =1

Ejemplo en OpenCV:
int a = cvContourArea(contorno, CV_WHOLE_SEQ);
// CV_WHOLE_SEQ indica que se toma el contorno

de principio a fin.

27

DESCRIPTORES DEL CONTORNO: PERMETRO

Obtener una regin rectangular que encierre un


contorno:

CvRect cvBoundingRect(
CvSeq* contour, //Secuencia de contornos
int update = 0
);

28

EJEMPLO:
CvSeq* contornos = 0;
CvMemStorage* storage = cvCreateMemStorage(0);
cvFindContours( imagen_binaria, storage, &contornos,
sizeof(CvContour), CV_RETR_TREE,
CV_CHAIN_APPROX_NONE, cvPoint(0,0)
);
// Los descriptores anteriores solo funcionan con
CV_CHAIN_APPROX_NONE
for( CvSeq* c = contornos; c != 0; c = c->h_next )
{
int p = cvContourPerimeter(c);
printf("Permetro: %i\n ", p );
}
cvReleaseMemStorage( &storage );
29

MOMENTOS:
Las formas de los lados de los contornos (y de las firmas)
se pueden describir cuantitativamente utilizando
momentos.
Un momento es un valor escalar calculado a partir de
una imagen, que no variarn aunque el objeto aparezca
en distinta posicin, rotado o con distinto tamao,
siempre que sea el mismo objeto.

tiles para el reconocimiento de objetos por su forma.


En la prctica debido al ruido, estos valores no sern
exactamente iguales.
No funcionan con objetos solapados o con varios objetos a la
vez (se deben separar los objetos a reconocer).

30

MOMENTOS:

Hallar el centro de masa del sistema lineal siguiente:

=1

=1



31

MOMENTOS:

Hallar el centro de masa de un sistema de masas


puntuales.


=

32

MOMENTOS:

Momentos de Orden 0 ( ): Suma todos los pxeles cuyo


valor es uno. Calcula el rea de una imagen.

00 = =

(, )
=1 =1

Momento de Orden 1 ( y ): Momentos respecto al


eje x (10 ), y respecto al eje y (01 ).

10 =

(, )
=1 =1

01 =

(, )
=1 =1

33

MOMENTOS:
Las coordenadas (X,Y) del centroide o centro de masa
son:
10
=
00
01
=
00
Los momentos centrales se usan para reconocer una
imagen independientemente de su situacin respecto a
los ejes de coordenadas.
A partir de los momentos centrales se pueden construir
un conjunto de siete momentos invariantes al cambio de
escala, simetra y rotacin llamados momentos Hu.

34

MOMENTOS EN OPENCV

La funcin que utiliza OpenCV para calcular los momentos de


un contorno es:
void cvContoursMoments(
CvSeq* contour,
CvMoments* moments
);

Obtener momentos cartesianos:


double cvGetSpatialMoment(
CvMoments* moments,
int x_order,
int y_order
);

//contorno
//momentos

//momentos
//orden en x
//orden en y
35

MOMENTOS EN OPENCV
Ejemplo:
CvMoments moments;
for( CvSeq* c = contornos; c != 0; c = c>h_next )
{
cvMoments(c, &moments);
M00 = cvGetSpatialMoment(&moments,0,0);
M10 = cvGetSpatialMoment(&moments,1,0);
M01 = cvGetSpatialMoment(&moments,0,1);
int x = (int)(M10/M00);
int y = (int)(M01/M00);

36

EJERCICIO

Detectar el centro de masa de al menos 2 LEDs


mediante resta de imgenes y momentos.

Tomar una imagen con los LEDs prendidos y otra con los LEDs
apagados.
Eliminar ruido, segmentar la regin creada por la resta,
rellenar huecos.
Obtener sus contornos
Obtener el centro de masa de los LEDs
Dibujar un crculo por cada LED. El centro de cada crculo
debe ser el centro de masa de cada LED.

37

MOMENTOS EN OPENCV

Los momentos Hu son invariantes a la traslacin,


rotacin y cambio de escala.

38

MOMENTOS EN OPENCV

Ejemplo obtener momentos Hu:

CvMoments moments;
------------------------------cvMoments(c, &moments);
CvHuMoments hu_moments;
cvGetHuMoments(&moments, &hu_moments);
printf(Momento Hu 1 = %f
",hu_moments.hu1);
39

LA TRANSFORMADA DE HOUGH
La Transformada de Hough es una tcnica usada para la
deteccin de figuras o primitivas geomtricas en
imgenes digitales (binaria o en escala de grises) .
Las figuras que deseamos encontrar se describen
mediante ecuaciones paramtricas.

40

LA TRANSFORMADA DE HOUGH
La imagen de entrada pude ser, por ejemplo, una
imagen con bordes extrados mediante el operador de
Canny.
Espacio de parmetros: El conjunto de todas las
combinaciones de los valores de parmetros de la
ecuacin de la primitiva a buscar.
El espacio de parmetros debe ser discretizado para
acortar la bsqueda a un conjunto finito de parmetros.
Entre ms parmetros consideremos, mayor ser la
precisin y la operacin ser ms costosa.

41

LA TRANSFORMADA DE HOUGH

Encontrar lneas:
La transformada de Hough encuentra puntos en la imagen
que satisfagan la ecuacin de la recta en su forma polar, para
distintos valores de y .
Ecuacin polar de la recta: + =
El espacio de parmetros se discretiza en una serie de celdas
denominadas celda de acumulacin.

42

LA TRANSFORMADA DE HOUGH
Cada pixel de la imagen votar por todas las ecuaciones
correspondientes a primitivas a las que permanezca dicho
punto recorriendo todas las combinaciones de parmetros
de el espacio de bsqueda.
Las primitivas con un valor de votos mayor a un umbral sern
reconocidas como lneas.

43

LA TRANSFORMADA DE HOUGH

Transformada de Hough para el crculo:


Se utiliza la siguiente ecuacin paramtrica:
( )2 +( )2 = 2
(a,b) es el centro del circulo, r es su radio.
La bsqueda es tridimensional y por lo tanto ms compleja
que con lneas.

44

LA TRANSFORMADA DE HOUGH

Ventajas
Cada pxel de la imagen se procesa de modo independiente,
lo que facilita su implementacin en paralelo.
La transformada "general de Hough es til para la deteccin
de formas complejas
Es capaz de reconocer patrones ligeramente deformados,
ocultos o discontinuos
Robusta frente al ruido

Inconvenientes
Tiempo y memoria
Ajustar el nivel de umbral de votos depende del problema.

45

EJERCICIO
Investigar como se realiza la transformada de Hough
para encontrar lneas en OpenCV.
Realizar un programa que obtenga las lneas de una
imagen.
Realizar un programa que obtenga las crculos de una
imagen.

46

También podría gustarte