• No se han encontrado resultados

Filtros en IPL y OpenCV OpenCV.

In document Procesamiento Audiovisual (página 89-99)

Operaciones de procesamiento local:Operaciones de procesamiento local:

A.3. Filtros en IPL y OpenCV OpenCV.

A.3. Filtros en IPL y OpenCV.OpenCV.

••

Filtros de Laplace de una imagenFiltros de Laplace de una imagen

::

void

void cvLaplacecvLaplace (const CvArr* A, CvArr* R, int apert(const CvArr* A, CvArr* R, int apertureSize=3)ureSize=3)

 –

 – AA: imagen de origen,: imagen de origen, RR: imagen de destino. Ambas deben ser de 1 solo: imagen de destino. Ambas deben ser de 1 solo canal. Además,

canal. Además, RR debe ser de 16 bits (sidebe ser de 16 bits (si AA es de 8), o float de 32.es de 8), o float de 32.

 –

 – apertureSizeapertureSize: tamaño de la máscara de convolución (igual que cvSobel).: tamaño de la máscara de convolución (igual que cvSobel).

 –

 – Calcula la laplaciana de una imagen (suma de las 2ª deriCalcula la laplaciana de una imagen (suma de las 2ª derivadas en X e Y).vadas en X e Y).  –

 – ¡¡Mucho cuidado!!¡¡Mucho cuidado!! La laplLa laplaciana puede tomaciana puede tomar ar valores negativos: no convertirvalores negativos: no convertir el resultado a 8U (los negativos se saturan a 0).

el resultado a 8U (los negativos se saturan a 0).

 –

 – Si se va a usar para unSi se va a usar para un perfiladoperfilado, el coeficiente que multiplica al resultado, el coeficiente que multiplica al resultado debe ser negativo, ya que usa máscaras “i

debe ser negativo, ya que usa máscaras “inversas” a las que hemos visto.nversas” a las que hemos visto.

••

Filtro de bordes de CannyFiltro de bordes de Canny

::

void

void cvCannycvCanny (const CvArr* img, CvArr* edges, double (const CvArr* img, CvArr* edges, double threshold1,threshold1, double threshold2, int apertureSize=3)

double threshold2, int apertureSize=3)  –

 – Ojo, es un filtro de bordes más avanzado que los otros. Usa filOjo, es un filtro de bordes más avanzado que los otros. Usa filtros de Stros de Sobel yobel y luego un algori

luego un algoritmo voraz para extmo voraz para extraer los bordes más traer los bordes más relevantes. Tambiénrelevantes. También requiere im

requiere imágenes de 1 sólágenes de 1 sólo canal, peroo canal, pero edgesedges puede ser de 8 bits.puede ser de 8 bits.

 –

 – threshold1threshold1,, threshold2threshold2: umbrales del al: umbrales del algoritmo. Se refieren al valor mínimogoritmo. Se refieren al valor mínimo de la magnitud del gradiente para ser considerada com

de la magnitud del gradiente para ser considerada como un borde ro un borde relevante.elevante.  –

A.3. Filtros en IPL y OpenCV.

A.3. Filtros en IPL y OpenCV.

 –

 – EjemploEjemplo. Apl. Aplicación del operador de icación del operador de bordes de Canny, sobrebordes de Canny, sobreimgimg.. IplImage *tmp=

IplImage *tmp= cvCreateImcvCreateImage(cvGetSize(img), IPL_DEPage(cvGetSize(img), IPL_DEPTH_8U, TH_8U, 1);1); IplImage *tmp2=

IplImage *tmp2= cvCreateImcvCreateImage(cvGetSize(img), IPL_DEPage(cvGetSize(img), IPL_DEPTH_8U, TH_8U, 1);1); cvCvtColor(img, tmp, CV_RGB2GRAY);

cvCvtColor(img, tmp, CV_RGB2GRAY); cvCanny(tmp, tmp2, param*4, param*3);

cvCanny(tmp, tmp2, param*4, param*3);  // Probar, p.ej., param=20  // Probar, p.ej., param=20 

cvZero(res); cvZero(res);

cvCopy(img, res, tmp2);

cvCopy(img, res, tmp2);  // res es el  // res es el resultado, del mismo tipo que img resultado, del mismo tipo que img 

cvReleaseImage(&tmp); cvReleaseImage(&tmp); cvReleaseImage(&tmp2); cvReleaseImage(&tmp2);

••

Otras convoluciones predefinidasOtras convoluciones predefinidas

:: void

void

iplFixedFilteriplFixedFilter

(IplImage* src, IplImage* dst, IplFilter filter)(IplImage* src, IplImage* dst, IplFilter filter)

 –

 – El parámetroEl parámetrofilterfilter es un nombre de fes un nombre de filtro predefinido. Piltro predefinido. Puede valer:uede valer: •• IPL_PREIPL_PREWWITT_3x3_V, IPL_PREWITTITT_3x3_V, IPL_PREWITT_3x3_H, _3x3_H, IPL_SOBEIPL_SOBEL_3x3_V,L_3x3_V,

IPL_SOBEL_3x3_H, IPL_LAPLACIAN_3x3, IPL_LAPLACIAN_5x5, IPL_SOBEL_3x3_H, IPL_LAPLACIAN_3x3, IPL_LAPLACIAN_5x5, IPL_GAUSSIAN_3x3, IPL_GAUSSIAN_5x5, IPL_HIPASS_3x3, IPL_GAUSSIAN_3x3, IPL_GAUSSIAN_5x5, IPL_HIPASS_3x3, IPL_HIPASS_5x5, IPL_SHARPEN_3x3.

IPL_HIPASS_5x5, IPL_SHARPEN_3x3.

 –

P

Prroocceessaammiieenntto o AAuuddiioovviissuuaall 9911

A.3. Filtros en IPL y OpenCV.

A.3. Filtros en IPL y OpenCV.

••

Filtros lineales arbitrariosFiltros lineales arbitrarios

:: son los más flexibles. Nosson los más flexibles. Nos definimos la máscara de convolución que queramos y definimos la máscara de convolución que queramos y lala aplicamos sobre las imágenes.

aplicamos sobre las imágenes.

•• Para los filtros que están predefinidos no hace falta utilizar estasPara los filtros que están predefinidos no hace falta utilizar estas funciones (que, además, serán menos eficientes).

funciones (que, además, serán menos eficientes).

•• IPL y OpenCV manejan las máscaras de cIPL y OpenCV manejan las máscaras de convolución de formaonvolución de forma distinta:

distinta:  –

 –

OpenCVOpenCV

: la máscara de convoluci: la máscara de convolución es una matriz de tipoón es una matriz de tipo

CvMat

CvMat

, de 1 c, de 1 canal y profundidad 32F.anal y profundidad 32F.  –

 –

IPLIPL

: se definen dos tipos específicos para las máscaras de: se definen dos tipos específicos para las máscaras de convolución,

convolución,

IplConvKernelIplConvKernel

(máscara de coeficientes enteros(máscara de coeficientes enteros o char) e

o char) e

IplConvKernelFPIplConvKernelFP

(coeficientes float). Hay(coeficientes float). Hay operaciones para crear, eliminar y aplicar la másc

operaciones para crear, eliminar y aplicar la máscara.ara.

•• En general, es más sencillEn general, es más sencillo utilizar las operaciones de OpenCV.o utilizar las operaciones de OpenCV. •• Aunque las de IPL son más flexibles y pueden ser másAunque las de IPL son más flexibles y pueden ser más

eficientes... eficientes...

A.3. Filtros en IPL y OpenCV.

A.3. Filtros en IPL y OpenCV.

••

Aplicar una máscara de convolución arbitraria en OpenCVAplicar una máscara de convolución arbitraria en OpenCV

:: void

void

cvFilter2DcvFilter2D

(const CvArr* src, CvArr* dst,(const CvArr* src, CvArr* dst,

const CvMat* kernel, CvPoint anchor=cvPoint(-1,-1)) const CvMat* kernel, CvPoint anchor=cvPoint(-1,-1))

 –

 – Las imágenesLas imágenes srcsrc yy dstdst deben ser del mismo tipo y tamaño.deben ser del mismo tipo y tamaño.

 –

 – kernelkernel es una matries una matriz de 1 canal y 32F (usar el tz de 1 canal y 32F (usar el tipo CV_32FCipo CV_32FC1),1), indica los coeficientes de l

indica los coeficientes de la másca máscaraara

 –

 – anchoranchor es el punto de ancla (por defecto, el centro de la máscara).es el punto de ancla (por defecto, el centro de la máscara).

 –

 – La operación admite modo inLa operación admite modo in-place.-place.

 –

 – EjemploEjemplo. Apl. Aplicar a icar a la imagen img el perfila imagen img el perfilado de llado de la a pág. 55.pág. 55. int w= 3, h= 3;

int w= 3, h= 3;  // Tamaño de la máscara de convolución  // Tamaño de la máscara de convolución 

float coef[3][3]= {{-1,-1,-1}, {-1,9,-1}, {-1,-1,-1}};

float coef[3][3]= {{-1,-1,-1}, {-1,9,-1}, {-1,-1,-1}}; // Coeficientes  // Coeficientes 

CvMat *mask= cvCreateMat(h, w,

CvMat *mask= cvCreateMat(h, w, CV_32FCCV_32FC1);1); for (int y= 0; y<h; y++)

for (int y= 0; y<h; y++) for (int x= 0; x<w; x++) for (int x= 0; x<w; x++)

cvSet2D(mask,

cvSet2D(mask, y, x, y, x, cvScalar(coef[y][x]));cvScalar(coef[y][x])); cvFilter2D(img, img, mask);

P

Prroocceessaammiieenntto o AAuuddiioovviissuuaall 9933

A.3. Filtros en IPL y OpenCV.

A.3. Filtros en IPL y OpenCV.

••

Aplicar una máscara de convolución arbitraria en OpenCVAplicar una máscara de convolución arbitraria en OpenCV

::  –

 – Si la máscara de convolución cae fuera de la imagen, losSi la máscara de convolución cae fuera de la imagen, los píxeles que se salen se interpolan con los píxeles de los píxeles que se salen se interpolan con los píxeles de los bordes de la propia imagen.

bordes de la propia imagen.  –

 –

EjemploEjemplo

. Aplicar a la imagen img el perfilado de la pág. . Aplicar a la imagen img el perfilado de la pág. 5555 (método alternativo).

(método alternativo). int w= 3, h= 3;

int w= 3, h= 3;  // Tamaño de la máscara  // Tamaño de la máscara 

float

float coef[3*3]= coef[3*3]= {-1,-1,-1, {-1,-1,-1, -1,9,-1, -1,9,-1, -1,-1,-1};-1,-1,-1};  // Coeficientes  // Coeficientes 

CvMat *mask= cvCreateMatHeader(h, w,

CvMat *mask= cvCreateMatHeader(h, w, CV_32FC1);CV_32FC1); cvSetData(mask, coef,

cvSetData(mask, coef, w*sizeof(float)w*sizeof(float));); cvFilter2D(img, img, mask);

cvFilter2D(img, img, mask); cvReleaseMat(&mask);

cvReleaseMat(&mask); Esta es una forma alternativaEsta es una forma alternativa (y más rápida) para crear una (y más rápida) para crear una

matriz de tipo

A.3. Filtros en IPL y OpenCV.

A.3. Filtros en IPL y OpenCV.

••

Filtros no lineales de máximo, mínimo y medianaFiltros no lineales de máximo, mínimo y mediana

::

void

void iplMaxFilteriplMaxFilter (IplImage* srcImage, IplIm(IplImage* srcImage, IplImage* age* dstImage,dstImage,

int nCols, int nRows, int anchorX, int anchorY) int nCols, int nRows, int anchorX, int anchorY) void

void iplMinFilteriplMinFilter (IplImage(IplImage* * srcImage, IplImagsrcImage, IplImage* e* dstImage,dstImage,

int nCols, int nRows, int anchorX, int anchorY) int nCols, int nRows, int anchorX, int anchorY) void

void iplMedianFilteriplMedianFilter(IplImage* srcImage, IplImage* dstImage,(IplImage* srcImage, IplImage* dstImage, int nCols, int nRows, int anchorX, int anchorY) int nCols, int nRows, int anchorX, int anchorY)

 –

 – El tamaño del filtro esEl tamaño del filtro es nColsnColsxxnRowsnRowsy el ancla (y el ancla (anchorXanchorX,,anchorYanchorY)) (empezando en 0,0).

(empezando en 0,0).

 –

 – Admite imágenes mulAdmite imágenes multicanal, pero no ticanal, pero no permite uso inpermite uso in-place.-place.

 –

 – Recordar el problema de la Recordar el problema de la aparición de colores falsos. Para eviaparición de colores falsos. Para evitarlo,tarlo, existe l

existe la fa función:unción: iplColorMedianFilteriplColorMedianFilter. E. Encuentra la medincuentra la mediana en unana en un espacio de color 3D.

espacio de color 3D.

 –

 – Conceptualmente Conceptualmente es más adecuado, pero en es más adecuado, pero en la práctila práctica es muchoca es mucho más lento y produce práct

más lento y produce prácticamente licamente los mios mismos resultados.smos resultados.

 –

 – Usar la funciónUsar la función iplSetBorderModeiplSetBorderMode antes aplicar los filtros, paraantes aplicar los filtros, para indicar l

indicar lo o que se hace con los que se hace con los píxeles de los bordes. Recomendado:píxeles de los bordes. Recomendado: iplSetBorderMode(img, IPL_BORDER_REPLICATE, IPL_SIDE_ALL, 0); iplSetBorderMode(img, IPL_BORDER_REPLICATE, IPL_SIDE_ALL, 0);

P

Prroocceessaammiieenntto o AAuuddiioovviissuuaall 9955

A.3. Filtros en IPL y OpenCV.

A.3. Filtros en IPL y OpenCV.

•• En OpenCV, recordar que laEn OpenCV, recordar que la

medianamediana

se puede obtenerse puede obtener con:

con:

cvSmoothcvSmooth

(src, dst, CV_MEDIAN, tamaño);(src, dst, CV_MEDIAN, tamaño);

••

Filtros de morfología matemáticaFiltros de morfología matemática

: el manejo es parecido a: el manejo es parecido a las convoluciones arbitrar

las convoluciones arbitrarias. 1º: definir ias. 1º: definir unun

elementoelemento

estructurante

estructurante

. 2º: aplicarlo sobre las im. 2º: aplicarlo sobre las imágenes conágenes con operaciones de erosión, dilatación, apertura o

operaciones de erosión, dilatación, apertura o cierre.cierre.

•• El elemento estructurante es de tipoEl elemento estructurante es de tipo

IplConvKernelIplConvKernel

. Aunque. Aunque también podemos ahorrarnos ese paso

también podemos ahorrarnos ese paso si usamos elsi usamos el elemento por defecto, un rectángulo de

elemento por defecto, un rectángulo de 3x3.3x3.

••

Crear y liberarCrear y liberar

un elemento estructurante:un elemento estructurante:

 –

 – cvCreateStructuringElementEx, cvReleaseStructuringElementcvCreateStructuringElementEx, cvReleaseStructuringElement

••

Operaciones básicasOperaciones básicas

de morfología matemática:de morfología matemática:

 –

 – cvErode, cvDilatecvErode, cvDilate

••

Operaciones extendidasOperaciones extendidas

::

 –

A.3. Filtros en IPL y OpenCV.

A.3. Filtros en IPL y OpenCV.

••

Crear un elemento estructuranteCrear un elemento estructurante

::

IplConvKernel*

IplConvKernel* cvCreateStructuringElementExcvCreateStructuringElementEx (int nCols, i(int nCols, int nRows,nt nRows, int anchorX, int anchorY,

int anchorX, int anchorY, CvElementSCvElementShape shape, inthape shape, int* values)* values)

 –

 – El tamaño del elemento es deEl tamaño del elemento es de nColsnCols xx nRowsnRows, y el ancla está, y el ancla está situada en (

situada en (anchorXanchorX,, anchorYanchorY).).

 –

 – Existen dosExisten dos alternativasalternativas: : usar una fusar una forma predefinida o una propia.orma predefinida o una propia.

 –

 – Si se quiere una forma predefiniSi se quiere una forma predefinida, da, el parámetroel parámetroshapeshape puede valer:puede valer: CV_SHAPE_RECT, CV_SHAPE_CROSS, CV_SHAPE_ELLIPSE. CV_SHAPE_RECT, CV_SHAPE_CROSS, CV_SHAPE_ELLIPSE.

 –

 – Para una forma propia,Para una forma propia, shapeshape debe valer CV_SHAPE_CUSTOM, ydebe valer CV_SHAPE_CUSTOM, y

values

values será un array conserá un array con las celdlas celdas (cero / no cero) del elas (cero / no cero) del elementoemento estructurante

estructurante (de arriba abajo, de izquierda a (de arriba abajo, de izquierda a derecha).derecha).

••

Liberar un elemento estructuranteLiberar un elemento estructurante

::

void

voidcvReleaseStructuringElementcvReleaseStructuringElement (IplCo(IplConvKernel** nvKernel** ppElement)ppElement)

 –

 – Ojo, ver que recibe un doble puntero.Ojo, ver que recibe un doble puntero.

 –

P

Prroocceessaammiieenntto o AAuuddiioovviissuuaall 9977

A.3. Filtros en IPL y OpenCV.

A.3. Filtros en IPL y OpenCV.

••

Aplicar erosión morfológica a una imagenAplicar erosión morfológica a una imagen

::

void

void cvErodecvErode (const CvArr* A, CvArr* R, IplConvKernel(const CvArr* A, CvArr* R, IplConvKernel* B=0, i* B=0, int iteratint iterations=1)ons=1)

 –

 – Aplica uno o varios pasos de erosión, según el parámetroAplica uno o varios pasos de erosión, según el parámetroiterationsiterations..

 –

 – Soporta modo in-place e Soporta modo in-place e imágenes multicanal.imágenes multicanal.

 –

 – Si el elementoSi el elemento BB es NULL (el valor por defeces NULL (el valor por defecto) se usa un rectánguloto) se usa un rectángulo de 3x3.

de 3x3.

••

Aplicar dilatación morfológica a una imagenAplicar dilatación morfológica a una imagen

::

void

void cvDilatecvDilate (const CvArr* A, CvArr* R, IplConvKernel(const CvArr* A, CvArr* R, IplConvKernel* B=0, i* B=0, int iteratint iterations=1)ons=1)

 –

 – Aplica uno o varios pasos de dilatación, según Aplica uno o varios pasos de dilatación, según el parámetroel parámetroiterationsiterations..

 –

 – Soporta modo in-place e Soporta modo in-place e imágenes multicanal.imágenes multicanal.

 –

 – Si el elementoSi el elemento BB es NULL (el valor por defectes NULL (el valor por defecto) se usa un rectánguloo) se usa un rectángulo de 3x3.

de 3x3.

 –

 – EjemploEjemplo. Apl. Aplicar una icar una dilatación de 5x5, con elemento en forma de cruz.dilatación de 5x5, con elemento en forma de cruz.

IplC

IplConvKernel* onvKernel* el= cvCreateStructuringEel= cvCreateStructuringElementEx(5,5,2,2,CV_SHAPE_CROSS, lementEx(5,5,2,2,CV_SHAPE_CROSS, 0);0);

cvErode(img, res, el, 1); cvErode(img, res, el, 1);

cvReleaseStructuringElement(&el); cvReleaseStructuringElement(&el);

 –

A.3. Filtros en IPL y OpenCV.

A.3. Filtros en IPL y OpenCV.

••

Aplicar operaciones morfológicas compuestasAplicar operaciones morfológicas compuestas

::

void

void

cvMorphologyExcvMorphologyEx

(const CvArr* A, CvArr* R, CvArr* t(const CvArr* A, CvArr* R, CvArr* temp,emp, IplC

IplConvKernel* B, CvMorphOp op, int ionvKernel* B, CvMorphOp op, int iterations)terations)

 –

 – Permite aplPermite aplicar una icar una operación morfológica compuesta por otrasoperación morfológica compuesta por otras elemental

elementales, erosiones, dilataciones y diferencies, erosiones, dilataciones y diferencias.as.

 –

 – El parámetroEl parámetro

opop

indica el indica el tipo de opertipo de operación: CVación: CV_MOP_OPEN_MOP_OPEN,, CV_MOP_CLOSE, CV_MOP_GRADIENT, CV_MOP_TOPHAT, CV_MOP_CLOSE, CV_MOP_GRADIENT, CV_MOP_TOPHAT, CV_MOP_BLACKHAT.

CV_MOP_BLACKHAT.

 –

 – El parámetroEl parámetro

temptemp

es una imagen temporal para cálculos internoses una imagen temporal para cálculos internos (del mismo tamaño y tipo que A y C). Se necesit

(del mismo tamaño y tipo que A y C). Se necesita en los tres últimosa en los tres últimos tipos de operaciones.

tipos de operaciones.

 –

 –

EjemploEjemplo

. Los dos siguientes códigos deberí. Los dos siguientes códigos deberían dar la misma salida:an dar la misma salida:

a)

a) cvMorphologyExcvMorphologyEx(img, (img, res, tmres, tmp, NULL, p, NULL, CV_MOP_OCV_MOP_OPEN, 1);PEN, 1); b)

b) cvEcvErode(imrode(img, g, tmtmp, NULLp, NULL, 1);, 1); cvDilate(tmp, res, NULL, 1); cvDilate(tmp, res, NULL, 1);

A.3. Filtros en IPL y OpenCV.

A.3. Filtros en IPL y OpenCV.

••

Ejemplo 1.Ejemplo 1.

Aplicar un ajuste (o estiramAplicar un ajuste (o estiramiento) local deliento) local del

In document Procesamiento Audiovisual (página 89-99)

Documento similar