Detección de bordes

La detección de bordes se basa en los cambios de intensidad entre un pixel y su vecindario.
Para ello empleamos un filtro de matriz. Las matrices más usadas corresponden a la matriz de Laplace y su aproximación
Una matriz de Laplace, tiene la siguiente forma:

1 1 1
1 -8 1
1 1 1

Ahora tenemos que tener en cuenta que el color blanco se corresponde a 25 y el ne  gro a 0, y tenemos algo tal que:

255 255 255 Que lo multiplicamos por la matriz 255 255 255
255 255 255 255 -2040 255
0 0 0 0 0 0

Una vez hayamos hecho esto, sumamos todos los valores, y hayamos su valor absoluto, 765 en este caso.
El cual umbralizaremos (lo normal es entre 20 y 30) y diremos que el punto denota un borde

La info la he extraido y resumido a partir de aquí:
http://vidaartificial.com/index.php?title=Una_introduccion_a_la_Vision_Artificial_%28Generation5.org%29

#include "program.h"
#include <fstream>
#include <vector>

using namespace std;

/***********************************************
        Detector de Bordes:
                                1   1   1
Aplicamos una mascara tal que:  1  -8   1
                                1   1   1

sumamos los puntos y si esta por encima de un umbral
ese punto nos mola.

OpenCv usa un puntero, lo cual nos complica un poco la cosa
mi idea es, defino la matriz del mismo tamañao, y la inicializo
y entonces ya puedo acceder dentro de un bucle for
***********************************************/

int main (int argc, char **argv)
{

 IplImage *entrada = cvLoadImage(argv[1]);              //Leemos la entrada

 int alto    = entrada->height;                         //guardamos las propiedades
 int ancho   = entrada->width;
 int canales = entrada->nChannels;

 vector <int> columna;                                   //en cada columna vamos metiendo los datos, y luego todos los metemos en una fila
 vector <vector <int> > fila;                            //Luego la fila se compone de elementos columnas
 vector <vector <vector <int> > > img_canales;           //y un conjunto de filasxcolumnas, forman un canal

for(int z = 0; z < canales; z++)
{
     for(int f = 0; f < alto ;f++)
     {
        for(int c = 0; c < ancho ; c++)              {               columna.push_back(c);              }         fila.push_back(columna);         columna.clear();      }      img_canales.push_back(fila);    fila.clear();     }     /*      AHORA QUEDA COPIAR LOS DATOS EN LA MATRIZ  El parametro widthStep, indica el número de bytes utilizados para representar cada fila de una imagen.  Una imagen de anchura 101 píxeles, de tipo byte con un widthStep igual a 104, codificará cada fila como una ristra de 104 bytes, de los cuales los 101 primeros se corresponderán con los píxeles de cada fila. ¿Y los 3 restantes, en este ejemplo? OpenCv los rellena con ‘/0′. En OpenCV, el campo widthStep siempre tiene que ser múltiplo de 4. Siempre. Así pues, una imagen (tanto en color como en escala de grises) de tipo byte con anchura de 102 píxeles tendrá un widthStep con valor 104, exactamente el mismo que para otra imagen diferente de anchura 103 ó 104. Esto es así porque la mínima cantidad de memoria que se puede reservar es de 4 bytes en algunos formatos de imagen. */  /*          este trozo de codigo invierte una imagen*/ int step      = entrada->widthStep;
uchar* data      = (uchar *)entrada->imageData;

  for(int i=0;i<alto;i++)
     for(int j=0;j<ancho;j++)
        for(int k=0;k<span 				data-mce-type="bookmark" 				id="mce_SELREST_start" 				data-mce-style="overflow:hidden;line-height:0" 				style="overflow:hidden;line-height:0" 			></span><canales;k++)
            data[i*step+j*canales+k]= 255-data[i*step+j*canales+k];

 cvNamedWindow("kk");
 cvShowImage("kk",entrada);
 cvWaitKey(0);

 return 0;
}
Anuncios
  1. Deja un comentario

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

w

Conectando a %s

A %d blogueros les gusta esto: