Professional Documents
Culture Documents
PROCESAMIENTO
Tema 2. Procesamiento
AUDIOVISUAL
global de imgenes.
Programa de teora
2.1. Tipos de operaciones. Histogramas.
1. Adquisicin y representacin de imgenes.
2. Procesamiento global de imgenes. 2.2. Operaciones elementales con pxeles.
3. Filtros y transformaciones locales. 2.3. Transformaciones del histograma.
4. Transformaciones geomtricas.
2.4. Combinacin de imgenes.
5. Espacios de color y el dominio frecuencial.
6. Anlisis de imgenes. 2.5. Transformaciones de color.
7. Vdeo y sonido digital. A.2. Procesamiento global en IPL y OpenCV.
Procesamiento
(c) Gins Garca Audiovisual
Mateos, http://dis.um.es/profesores/ginesgm 1 Procesamiento Audiovisual 2
Temade
Dept. 2. Informtica
Procesamiento global de imgenes.
y Sistemas, Universidad de Murcia Tema 2. Procesamiento global de imgenes.
1
2.1. Tipos de operaciones. Histogramas. 2.1. Tipos de operaciones. Histogramas.
Para comprender el significado de muchas transforma-
R(x,y):= f(A(x,y)), (x,y) ciones y saber cul conviene aplicar se usan histogramas.
Qu es un histograma? Repasar estadstica...
Comparar con: Un histograma representa grficamente una distribucin
Filtros y convoluciones: el valor de un pxel depende de frecuencias.
de la vecindad local de ese pxel: Histograma de una imagen: representa las frecuencias
R(x,y):= f(A(x-k,y-k), ..., A(x,y), ..., A(x+k,y+k)) de los diferentes valores de gris en la imagen.
Transformaciones geomtricas: el valor de un pxel
(nmero de pxeles)
depende de pxeles situados en otras posiciones:
Frecuencia
R(x,y):= A(f 1(x,y), f2(x,y))
Transformaciones lineales: el valor de un pxel puede
depender de todos los pxeles de la imagen:
R(x,y):= f(A, x, y) 0 127 255
Nivel de gris
Procesamiento Audiovisual 7 Procesamiento Audiovisual 8
Tema 2. Procesamiento global de imgenes. Tema 2. Procesamiento global de imgenes.
Frecuencia
0 127 255
0 127 255
Ejemplo 2. La imagen es muy clara. Sobra brillo. Ejemplo 4. Hay mucho contraste, pocos medios tonos.
Frecuencia
Frecuencia
0 127 255
0 127 255
Procesamiento Audiovisual 11 Procesamiento Audiovisual 12
Tema 2. Procesamiento global de imgenes. Tema 2. Procesamiento global de imgenes.
2
2.1. Tipos de operaciones. Histogramas. 2.1. Tipos de operaciones. Histogramas.
Histogramas de color. En imgenes multicanal podemos O, tambin, podemos calcular histogramas conjuntos, en 2
obtener un histograma de cada canal por separado. 3 dimensiones.
Canales R y G Canales G y B Canales R y B
Canal Rojo Canal Verde Canal Azul Estos histogramas aportan informacin sobre los rangos de
colores ms frecuentes en la imagen.
En teora, el histograma es de 256x256 celdas (bins).
Pero, para obtener buenos resultados, mejor usar un
0 127 255 0 127 255 0 127 255 nmero reducido de celdas. Por ejemplo 64x64 32x32.
Procesamiento Audiovisual 13 Procesamiento Audiovisual 14
Tema 2. Procesamiento global de imgenes. Tema 2. Procesamiento global de imgenes.
2.2. Operaciones elementales con pxeles. 2.2. Operaciones elementales con pxeles.
Ojo: la suma puede ser mayor que 255...
Sumar una constante: R(x, y):= A(x, y) + a
La operacin debera comprobar el overflow:
Significado: incrementar el brillo de la imagen en la si A(x, y) + a > 255 entonces R(x, y):= 255
cantidad indicada en a. sino R(x, y):= A(x, y) + a
El histograma se desplaza a la derecha en a pxeles.
Esto se debe hacer tambin en las dems operaciones,
comprobando si el valor es <0 >255.
Coloquialmente, un pxel por encima de 255 o por
debajo de 0 se dice que
Ejemplo de imagen
muy saturada
est saturado.
La saturacin supone
a una prdida de
informacin.
3
2.2. Operaciones elementales con pxeles. 2.2. Operaciones elementales con pxeles.
En imgenes en color, la suma se realiza sobre los Restar una constante: R(x, y):= A(x, y) - a
tres canales (R, G y B) y con el mismo valor.
Significado: decrementar el brillo de la imagen en la
R(x, y).R:= A(x, y).R + a R(x, y).G:= A(x, y).G + a cantidad indicada en a.
R(x, y).B:= A(x, y).B + a El histograma se desplaza a la izquierda en a pxeles.
2.2. Operaciones elementales con pxeles. 2.2. Operaciones elementales con pxeles.
Multiplicar por una constante: R(x, y):= bA(x, y) Tanto en la suma como en la multiplicacin, se aumenta el
nivel de gris de los pxeles, pero de forma distinta.
Significado: aumentar la intensidad de la imagen en b.
En la suma, el parmetro a (entero) indica el nmero de
El histograma se estira hacia la izquierda. niveles de gris a aumentar: de -255 a 255.
En el producto, el parmetro b (real) indica el factor a
multiplicar.
b=1 Ningn cambio
b=2 Se duplica el valor de gris. Los px. >127 se saturan.
b=0,5 Se encoge a la mitad el histograma.
Suma Multiplicacin
0+a 0*b
Procesamiento Audiovisual 21 Procesamiento Audiovisual 22
Tema 2. Procesamiento global de imgenes. Tema 2. Procesamiento global de imgenes.
f: curva
128
tonal
64
0
4
2.3. Transformaciones del histograma. 2.3. Transformaciones del histograma.
Identidad: f(v):= v Suma: f(v):= v + a Resta: f(v):= v - a
En general, podemos definir Ej. Inversa: f(v):= 255 - v
255
255
255
255
192
a una transformacin lineal
192
192
192
genrica de la forma:
128
128
128
f(v):= bv + a
128
64
64
64
a
64
0
0
0
0 64 128 192 255 0 64 128 192 255 0 64 128 192 255
0
0 64 128 192 255
192
cuadrtica, polinomial, exponencial, logartmica,
192
192
escalonada, etc.
128
128
128
0
0
0
Histograma de R
f(v):= (v-m)*255/(M-m) R
192
128
simple regla de 3 m M
0
Histograma de A
5% 5%
5
2.3. Transformaciones del histograma. 2.3. Transformaciones del histograma.
La transformacin de histograma puede tomar
255
Elevar a 2, elevar a 1/2, ...
cualquier forma (no necesariamente lineal).
192
Se define la transformacin
Ejemplos.
128
Dos trozos de curva de gama como:
Parbola: c 1v2 + c2v + c3 Raz: c 1v0.5 + c2 (parbola y raz)
f(v):= 255(v/255)1/GAMA
64
255
255
255
Valor de salida
0
192
192
192
128
128
128
64
64
64
0
0
0
Blanco Negro
192
?
64 128
0
f[i]:= acumulado*255/np
3
finpara
f[255]:= 255
1
0
6
2.3. Transformaciones del histograma. 2.3. Transformaciones del histograma.
Imagen de entrada (A) Imagen ecualizada (R) Ejemplos. Ecualizacin del histograma.
255
255
255
192
192
192
inferior superior
128
128
128
64
64
64
0
0
0
7
2.3. Transformaciones del histograma. 2.4. Combinacin de imgenes.
Conclusiones: Combinacin de imgenes: utilizar dos o ms
Una transformacin elemental se puede ver desde imgenes de entrada para producir una imagen de
distintas perspectivas: salida.
Como una funcin unidimensional: f: N N Entrada: imgenes A y B. El valor del pxel resultante es
funcin de los pxeles de A y B
Como una curva tonal. Salida: imagen R. en la misma posicin
Como una modificacin del histograma.
La caracterstica fundamental es que cada pxel se En principio, todas las
R(x, y):= f(A(x,y), B(x,y))
imgenes deben ser del
trata independientemente de los dems.
mismo tamao
Los histogramas son tiles para encontrar la Posibles operaciones de combinacin:
transformacin adecuada.
Booleanas: and, or, xor, not
En imgenes RGB, aplicamos la misma operacin a Aritmticas: suma, resta, producto/divisin, media
los 3 canales para que se mantenga el color.
Relacionales: mximo, mnimo
Procesamiento Audiovisual 43 Procesamiento Audiovisual 44
Tema 2. Procesamiento global de imgenes. Tema 2. Procesamiento global de imgenes.
no binarias no
tienen mucho A B C
sentido...
Cmo se
interpretan?
8
2.4. Combinacin de imgenes. 2.4. Combinacin de imgenes.
1. T1:= B AND NOT C T1
La imagen binaria (C) se suele denominar mscara.
B NOT C
La mscara permite segmentar el objeto de inters.
C R
2. T2:= A AND C T2
A C
!?
3. R:= T1 OR T2 R Cuestiones:
T1 T2 Cmo crear la mscara de forma automtica?
La zona del pelo no se mezcla bien con el fondo.
Cmo evitar este problema?
Procesamiento Audiovisual 49 Procesamiento Audiovisual 50
Tema 2. Procesamiento global de imgenes. Tema 2. Procesamiento global de imgenes.
B
Se usan en generacin y anlisis de imgenes.
Cuidado con los problemas de saturacin.
En imgenes binarias son equivalentes (en su
mayora) a los operadores booleanos. Ojo: [0..255] + [0..255] = [0..510]
B
La media ponderada se puede
usar para crear una transicin
suave entre imgenes (o vdeos).
Significado: las imgenes son
semitransparentes (al 50%).
Procesamiento Audiovisual 53 Procesamiento Audiovisual 54
Tema 2. Procesamiento global de imgenes. Tema 2. Procesamiento global de imgenes.
9
2.4. Combinacin de imgenes.
La media de imgenes se puede usar para acumular
2.4. Combinacin de imgenes.
imgenes de un vdeo. Ejemplo 2. Crear un modelo de fondo de una escena,
Ejemplo 1. Combinar imgenes con mucho ruido de una acumulando varias imgenes.
escena, para obtener una mezcla con menos ruido.
Modelo de
Imgenes de fondo
Quickcam
Imgenes
Imagen Idea: si adems de la media en cada pxel calculamos
capturadas
acumulada tambin la varianza, podramos tener un modelo
de TV
gaussiano del fondo (N(,)).
Procesamiento Audiovisual 55 Procesamiento Audiovisual 56
Tema 2. Procesamiento global de imgenes. Tema 2. Procesamiento global de imgenes.
B-A (B-A)*
B B
[0..255] - [0..255] =
[-255..255] La mitad
de los pxeles se
saturan a 0
Procesamiento Audiovisual 57 Procesamiento Audiovisual 58
Tema 2. Procesamiento global de imgenes. Tema 2. Procesamiento global de imgenes.
? Son muy
distintas...
B
Pxel negro: las dos imgenes son
Dif.
iguales en ese pxel.
x16
Cuando ms clara es una zona, ms
se diferencian las imgenes.
Procesamiento Audiovisual 59 Procesamiento Audiovisual 60
Tema 2. Procesamiento global de imgenes. Tema 2. Procesamiento global de imgenes.
10
2.4. Combinacin de imgenes. 2.4. Combinacin de imgenes.
Ejemplo 2. Segmentacin del fondo de una escena. Proceso.
M
Tenemos un fondo (imagen media) y una nueva imagen. 1. Obtener el modelo de fondo
M.
Modelo de fondo Frame 1 Frame 2 A
2. Para cada imagen A del
vdeo.
D
3. Calcular la diferencia: D =
abs(M-A).
U
4. Umbralizar la imagen con
un valor adecuado. U =
umbralizar(D, x). F
Idea: esto se
puede usar para 5. Sea F el nuevo fondo.
R
crear la mscara... 6. R:= (F AND NOT U) OR (A
Cmo? AND U)
Cmo
arreglar eso?
Procesamiento Audiovisual x2 61 x2 Procesamiento Audiovisual 62
Tema 2. Procesamiento global de imgenes. Tema 2. Procesamiento global de imgenes.
B
Tambin es necesario escalar A*B1 A*B2
el resultado (multiplicar por
255).
Cul es interpretacin del
resultado?
11
2.4. Combinacin de imgenes. 2.4. Combinacin de imgenes.
Estos mismos tipos de imgenes se pueden usar para Ejemplo 2. Mezcla y combinacin de imgenes.
hacer sumas, restas, divisiones, etc. Queremos combinar dos imgenes, por ejemplo, para
poner una etiqueta descriptiva en una foto. Una imagen
Ejemplo. R(x, y):= A(x, y)B(x, y)/128 binaria sirve de mscara: 0 = fondo, 1 = etiqueta.
Si B(x, y) = 128 el pxel de A no cambia.
A B M
Si B(x, y) < 128 el pxel se oscurece.
Si B(x, y) > 128 el pxel se aclara.
12
2.4. Combinacin de imgenes.
2.4. Combinacin de imgenes.
Con esto tenemos otra forma de hacer la segmentacin
de los objetos. Conclusiones:
Modelo de fondo Frame 1 Frame 2 Operaciones de combinacin: a partir de dos o ms
imgenes obtener una nueva imagen.
La operacin a aplicar depende de lo que queramos
conseguir.
Operaciones booleanas: tiles para trabajar con
mscaras de objetos.
La mscara ya
Operaciones aritmticas: tiles en vdeo, modelos
est binarizada
acumulados, deteccin de movimiento, transparencias
difusas, etc.
En general, cualquier tipo de operacin es posible, ya
sean lineales o no lineales.
Procesamiento Audiovisual 73 Procesamiento Audiovisual 74
Tema 2. Procesamiento global de imgenes. Tema 2. Procesamiento global de imgenes.
13
2.5. Transformaciones de color. 2.5. Transformaciones de color.
Transformacin de color falso Ejemplo. Transformacin de color falso.
Las transformaciones de este tipo son comunes en
Es una transformacin de la misma familia, cuyo objetivo es
imgenes mdicas y de satlite.
hacer ms visibles las pequeas variaciones del nivel de
gris. En estas aplicaciones, la profundidad del canal puede ser
fcilmente mayor que 1 byte. Al usar slo 256 grises se
Se define una paleta de salida adecuada y una
pierde informacin.
transformacin de cada valor de gris en la paleta.
R= 255 0 0 255
G= 255 255 0 0
B= 0 0 255 255
Imagen de entrada Imagen con color falso
Procesamiento Audiovisual 79 Procesamiento Audiovisual 80
Tema 2. Procesamiento global de imgenes. Tema 2. Procesamiento global de imgenes.
14
2.5. Transformaciones de color. 2.5. Transformaciones de color.
Finalmente, recordar que las operaciones de ajuste y Conclusiones:
ecualizacin del histograma se pueden aplicar
conjuntamente (usando el histograma de gris) o por Las transformaciones globales se pueden realizar
separado (usando el histograma de cada canal). igual en todos los canales o con valores distintos.
La diferencia es que mientras el primero mantiene los En el primer caso, habr un cambio en la intensidad.
colores (cambia la intensidad) el segundo no los mantiene. En el segundo, puede haber tambin un cambio de
Los colores parecen color.
poco realistas Balance de blancos: compensar los canales para
obtener los colores ms realistas posibles.
Veremos ms cuestiones relacionadas con el color
cuando estudiemos espacios de color.
A.2. Procesamiento global en IPL y OpenCV. A.2. Procesamiento global en IPL y OpenCV.
Operaciones de procesamiento global: Recordar: un Es importante observar las restricciones impuestas sobre
Tipos: unarias, binarias, histogramas. CvArr puede ser las imgenes admitidas en cada funcin.
un IplImage En otro caso ocurrir un error (se produce una excepcin).
void cvUnaria (const CvArr* A, ..., CvArr* B, ...)
void cvBinaria (const CvArr* A, const CvArr* B,.., CvArr* C, ...) Normalmente:
Todas las imgenes deben ser del mismo tipo: profundidad y
Las funciones reciben una (unarias) o dos (binarias) nmero de canales.
imgenes de entrada, y producen una de salida. Todas ellas Todas las imgenes deben tener el mismo tamao. Si se
deben estar creadas, tambin la imagen de salida. utilizan ROI, el tamao del ROI debe ser el mismo en todas.
La mayora de las funciones admite modo inplace: una Algunas funciones requieren imgenes con 1 solo canal.
imagen de entrada se puede usar tambin para guardar el Opcionalmente, algunas admiten el uso de una mscara
resultado. (mask), que ser otra imagen, de 8 bits y con un 1 canal. Un
Muchas de las operaciones trabajan con ROI, COI y mask valor 0 significa que el pxel no se procesa, y 0 s se procesa.
No operan sobre toda la imagen sino slo sobre una Ver la documentacin para cada funcin.
parte concreta (rectngulo, canal o mscara de inters).
Procesamiento Audiovisual 89 Procesamiento Audiovisual 90
Tema 2. Procesamiento global de imgenes. Tema 2. Procesamiento global de imgenes.
15
A.2. Procesamiento global en IPL y OpenCV. A.2. Procesamiento global en IPL y OpenCV.
Inicializar una imagen con un valor constante:
Operaciones unarias: void cvSet (CvArr* A, CvScalar S, const CvArr* mask=0)
cvSet, cvSetZero, cvCopy, cvAddS, cvSubS, cvSubRS, si mask(x,y)0 entonces A(x,y):= S
cvAbsDiffS, cvAbs, cvScale, cvConvert, cvConvertScale, Ejemplo. Inicializar a verde:
cvConvertScaleAbs, cvAndS, cvOrS, cvXorS, cvNot, cvCmpS, cvSet(img, cvScalar(0,255,0));
cvThreshold, cvAdaptiveThreshold, cvMaxS, cvMinS, cvPow, Inicializar una imagen con un valor 0:
cvLog void cvSetZero (CvArr* A) / void cvZero (CvArr* A)
Operaciones binarias: A(x,y):= 0
cvAdd, cvSub , cvAbsDiff, cvMul, cvDiv, cvAnd, cvOr, cvXor, Copiar una imagen en otra:
cvCmp, cvMax, cvMin void cvCopy (const CvArr* A, CvArr* B, const CvArr* mask =0)
Operaciones con histogramas: si mask(x,y)0 entonces B(x,y):= A(x,y)
Ejemplo. Copiar un trozo de imagen en otra imagen:
cvCreateHist, cvReleaseHist, cvCalcHist, cvQueryHistValue,
cvSetImageROI(img, cvRect(50,50, 100, 100));
cvGetHistValue, cvNormalizeHist, cvThreshHist,
img2= cvCreateImage(cvSize(100, 100), img->depth, img->nChannels);
cvGetMinMaxHistValue, cvLUT
cvCopy(img, img2);
cvResetImageROI(img);
Procesamiento Audiovisual 91 Procesamiento Audiovisual 92
Tema 2. Procesamiento global de imgenes. Tema 2. Procesamiento global de imgenes.
A.2. Procesamiento global en IPL y OpenCV. A.2. Procesamiento global en IPL y OpenCV.
Comparacin entre una imagen y un valor constante:
Y lgico entre una imagen y un valor constante (a nivel de bits): void cvCmpS (const CvArr* A, double S, CvArr* C, int cmp_op)
void cvAndS (const CvArr* A, CvScalar S, CvArr* C, const CvArr* mask=0)
C(x,y):= A(x,y) op S, con op {=, >, <, >=, <=}
si mask(x,y)0 entonces C(x,y):= A(x,y) AND S
cmp_op indica el modo de comparacin: CV_CMP_EQ (igual),
O lgico entre una imagen y un valor constante (a nivel de bits):
CV_CMP_GT (mayor que), CV_CMP_GE (mayor o igual), etc.
void cvOrS (const CvArr* A, CvScalar S, CvArr* C, const CvArr* mask=0) El resultado es una imagen binaria, con 0 255 (todos los bits a 1).
si mask(x,y)0 entonces C(x,y):= A(x,y) OR S Ver tambin la funcin cvInRangeS(img, scalar1, scalar2, res).
O exclusivo entre una imagen y un valor constante (a nivel de bits): Umbralizacin/binarizacin de una imagen:
void cvXorS (const CvArr* A, CvScalar S, CvArr* C, const CvArr* mask=0) void cvThreshold (const CvArr* src, CvArr* dst, double threshold,
si mask(x,y)0 entonces C(x,y):= A(x,y) XOR S double maxValue, int thresholdType)
Negacin lgica de una imagen (a nivel de bits): Umbraliza la imagen segn el mtodo dado en thresholdType. y el
umbral es threshold.
void cvNot (const CvArr* A, CvArr* C)
P.ej., CV_THRESH_BINARY para binarizar:
C(x,y):= NOT A(x,y)
C(x,y):= si A(x,y) > threshold entonces maxValue sino 0
Ejemplo. Vale para invertir una imagen: cvNot(img, img);
La umbralizacin se hace con un valor constante. Para un mtodo ms
Pero, para qu valen las otras operaciones booleanas con constantes? avanzado ver cvAdaptiveThreshold. El umbral se calcula para cada
pxel, usando una vecindad local (adaptativo).
16
A.2. Procesamiento global en IPL y OpenCV. A.2. Procesamiento global en IPL y OpenCV.
Mximo entre una imagen y un valor constante:
void cvMaxS (const CvArr* A, double scalar, CvArr* C) (est mal en la ayuda) Operaciones Binarias
C(x,y):= max {A(x,y), S} Sumar dos imgenes:
Las imgenes deben ser de un solo canal. void cvAdd (const CvArr* A, const CvArr* B, CvArr* C, const CvArr* mask=0)
Mnimo entre una imagen y un valor constante: si mask(x,y)0 entonces C(x,y):= A(x,y) + B(x,y)
void cvMinS (const CvArr* A, double scalar, CvArr* C) (est mal en la ayuda) Las imgenes deben tener el mismo tamao (o ROI) y el mismo tipo.
C(x,y):= min {A(x,y), S} Ojo: recordar los problemas de saturacin. Por ejemplo, para obtener la
Las imgenes deben ser de un solo canal. media de dos imgenes, im1, im2:
cvScale(im1, im1, .5, 0);
Potencia, exponencial y logaritmo de los pxeles de una imagen:
cvScale(im2, im2, .5, 0); // Qu pasa si hacemos primero la suma
void cvPow (const CvArr* A, CvArr* C, double p) C(x,y):= A(x,y) p cvAdd(im1, im2, imr, 0); // y luego la divisin por 2?
void cvExp (const CvArr* A, CvArr* C) C(x,y):= e A(x,y) Restar dos imgenes:
void cvLog (const CvArr* A, CvArr* C) C(x,y):= log e |A(x,y)|
void cvSub (const CvArr* A, const CvArr* B, CvArr* C, const CvArr* mask=0)
Para evitar saturacin y prdida de informacin, es conveniente
transformar las profundidad a reales de 32 o 64 bits. si mask(x,y)0 entonces C(x,y):= A(x,y) - B(x,y)
Ejemplo. Transformacin de gamma: Las imgenes deben tener el mismo tamao (o ROI) y el mismo tipo.
cvConvertScale(img, imr, 1./255, 0); // imr es de profundidad 32F Igual que antes, tener cuidado con los problemas de saturacin. Es ms
cvPow(imr, imr, gamma); adecuado usar enteros con signo.
cvConvertScale(imr, img, 255., 0);
Procesamiento Audiovisual 97 Procesamiento Audiovisual 98
Tema 2. Procesamiento global de imgenes. Tema 2. Procesamiento global de imgenes.
A.2. Procesamiento global en IPL y OpenCV. A.2. Procesamiento global en IPL y OpenCV.
Diferencia absoluta entre dos imgenes: Y lgico, a nivel de bits, entre dos imgenes:
void cvAbsDiff (const CvArr* A, const CvArr* B, CvArr* C) void cvAnd (const CvArr* A, const CvArr* B, CvArr* C, const CvArr* mask=0)
C(x,y):= |A(x,y) - B(x,y)| si mask(x,y)0 entonces C(x,y):= A(x,y) AND B(x,y)
Mejor en imgenes sin signo y cuando solo queremos medir diferencias. Tambin funciona con nmeros reales, pero para qu puede valer?
Multiplicar dos imgenes: Para que tenga sentido, al menos alguna de las dos imgenes debera
ser binaria (0/255).
void cvMul (const CvArr* A, const CvArr* B, CvArr* C, double scale=1)
C(x,y):= A(x,y)*B(x,y)*scale
El valor scale permite evitar problemas de saturacin. O lgico, a nivel de bits, entre dos imgenes:
Ejemplo: multiplicar dos imgenes de 8 bits: void cvOr (const CvArr* A, const CvArr* B, CvArr* C, const CvArr* mask=0)
cvMul(im1, im2, imr, 1./255); si mask(x,y)0 entonces C(x,y):= A(x,y) OR B(x,y)
Dividir dos imgenes:
void cvDiv (const CvArr* A, const CvArr* B, CvArr* C, double scale=1) O exclusivo, a nivel de bits, entre dos imgenes:
C(x,y):= scale*A(x,y)/B(x,y) void cvXor (const CvArr* A, const CvArr* B, CvArr* C, const CvArr* mask=0)
A puede ser nulo, en cuyo caso se supone que todos los pxeles son 1. si mask(x,y)0 entonces C(x,y):= A(x,y) XOR B(x,y)
Igual que antes, tener cuidado con los problemas de saturacin. Es ms
adecuado usar enteros con signo.
A.2. Procesamiento global en IPL y OpenCV. A.2. Procesamiento global en IPL y OpenCV.
Comparacin de dos imgenes: Observar el estilo de programacin usando estas funciones.
void cvCmp (const CvArr* A, const CvArr* B, CvArr* C, int cmp_op) Por ejemplo, queremos implementar la operacin:
C(x,y):= A(x,y) op B(x,y), con op {=, >, <, >=, <=} R(x,y):= A(x,y)(255-N(x,y))/255 + B(x,y)N(x,y)/255
Los mismos modos de comparacin que cvCmpS. void Combina (const CvArr* A, const CvArr* B, const CvArr* N, CvArr* R);
La imagen de salida es binaria 0/255. Las imgenes deben tener 1 canal.
Implementacin 1. Implementacin 2.
Ver tambin la funcin cvInRange(img, imMin, imMax, imRes).
cvMul(B, N, B, 1./255); for (int y=0; y<A->height; y++)
Mximo de dos imgenes: for (int x= 0; x<A->width; x++) {
cvNot(N, N); char Axy[3], Bxy[3], Nxy[3], Rxy[3];
void cvMax (const CvArr* A, const CvArr* B, CvArr* C)
C(x,y):= max {A(x,y), B(x,y)}
cvMul(A, N, A, 1./255); iplGetPixel(A, x, y, Axy);
cvAdd(A, B, R); iplGetPixel(B, x, y, Bxy);
Las imgenes deben tener 1 solo canal. iplGetPixel(N, x, y, Nxy);
Mnimo de dos imgenes: for (int k= 0; k<3; k++)
void cvMin (const CvArr* A, const CvArr* B, CvArr* C) Esto es ms sencillo y Rxy[k]= Axy[k]*(255-Nxy[k])/255.0 +
eficiente, porque las opera- Bxy[k]*Nxy[k]/255.0;
C(x,y):= min {A(x,y), B(x,y)}
iplSetPixel(R, x, y, Rxy);
Las imgenes deben tener 1 solo canal. ciones estn optimizadas
}
Aunque no del todo correcto, Esto es menos eficiente y
modifica sus parmetros de menos recomendable
Procesamiento Audiovisual 101 entrada A, B y N... Procesamiento Audiovisual 102
Tema 2. Procesamiento global de imgenes. Tema 2. Procesamiento global de imgenes.
17
A.2. Procesamiento global en IPL y OpenCV. A.2. Procesamiento global en IPL y OpenCV.
Operaciones con histogramas Propiedades de un histograma:
Nmero de dimensiones. Normalmente tendremos 1
Los histogramas se manejan de formas diferentes en IPL y
dimensin (escala de grises), 2 dimensiones (histogramas
en OpenCV. conjuntos de dos canales) o como mucho 3.
Utilizaremos los histogramas de OpenCV. Para cada dimensin, nmero de celdas (bins). Normalmente
IPL define algunas operaciones no disponibles en OpenCV ser una potencia de 2, como 256, 64, 32...
(iplContrastStretch y iplHistoEqualize) Deberemos Rango de valores correspondientes a cada celda, en el caso
definrnoslas nosotros. de haber menos celdas que valores (normalmt. ser uniforme).
En OpenCV se define el tipo CvHistogram y las Ejemplos. Histograma de 2 dimensiones
operaciones para manejarlo: cvCreateHist, cvReleaseHist, Histograma de 1 Bin 0 Bin 1
cvCalcHist, cvQueryHistValue, cvGetHistValue, dimensin y 4 celdas (0-127) (128-255)
cvNormalizeHist, cvThreshHist, cvGetMinMaxHistValue. Bin 0 (0-85)
Bin 0 Bin 1 Bin 2 Bin 3
Una cuestin relacionada son las tablas de (0-63) (64-127) (128-191) (192-255) Bin 1 (86-170)
transformacin (look-up table, o LUT).
Bin 2 (171-255)
Procesamiento Audiovisual 103 Procesamiento Audiovisual 104
Tema 2. Procesamiento global de imgenes. Tema 2. Procesamiento global de imgenes.
A.2. Procesamiento global en IPL y OpenCV. A.2. Procesamiento global en IPL y OpenCV.
Crear un histograma: Ejemplo. Crear un histograma con 2 dimensiones y 32 celdas en cada
dimensin:
CvHistogram* cvCreateHist (int cDims, int* dims, int type,
CvHistogram* hist2;
float** ranges=0, int uniform=1) int celdas[2]= {32, 32};
cDims: nmero de dimensiones del histograma. hist= cvCreateHist(2, celdas, CV_HIST_ARRAY);
dims: nmero de celdas en cada dimensin.
type: tipo, usar siempre CV_HIST_ARRAY. Liberar la memoria ocupada por un histograma:
uniform: poner a 1 para que el rango de valores en cada celda sea void cvReleaseHist (CvHistogram** hist)
uniforme. Calcular el histograma de una imagen:
ranges: rango asociado a cada celda de cada dimensin. Para void cvCalcHist (IplImage** img, CvHistogram* hist,
histogramas uniformes, es un array de pares (rmin, rmax) y las celdas
se reparten uniformemente este rango. Si la imagen es de 8 bits y el int doNotClear=0, const CvArr* mask=0)
rango es (0, ..., 255), se puede poner simplemente ranges=NULL. img: array de imgenes de 1 canal. Deben haber tantas como
Ejemplo. Crear un histograma con 1 dimensin y 256 celdas: nmero de dimensiones del histograma.
doNotClear: si se pone a TRUE, no borra el contenido anterior de
CvHistogram* hist1;
las celdas. Estos permite obtener histogramas acumulados de
int celdas= 256; varias imgenes.
hist= cvCreateHist(1, &celdas, CV_HIST_ARRAY); mask: mscara sobre la que se calcular el histograma.
Procesamiento Audiovisual 105 Procesamiento Audiovisual 106
Tema 2. Procesamiento global de imgenes. Tema 2. Procesamiento global de imgenes.
A.2. Procesamiento global en IPL y OpenCV. A.2. Procesamiento global en IPL y OpenCV.
Esta forma tan particular de calcular el histograma, hace que sea Una vez calculado... consultar las celdas del histograma:
necesario separar los canales de una imagen. float cvQueryHistValue_1D (CvHistogram*hist, int idx0)
Ejemplo 1. Calcular el histograma unidimensional del nivel de gris: Para el caso de histogramas unidimensionales.
IplImage *gris= cvCreateImage(cvGetSize(img), 8, 1); // Ver abajo Realmente no es una funcin sino un macro.
cvCvtColor(img, gris, CV_RGB2GRAY); float cvQueryHistValue_2D (CvHistogram*hist, int idx0, int idx1)
cvCalcHist(&gris, hist1, 0); Para el caso de histogramas bidimensionales.
Ejemplo 2. Calcular el histograma bidimensional de los canales R y G: De forma similar para histogramas 3D y ND.
IplImage *planos[3]; Obtener un puntero a una celda del histograma:
planos[0]= cvCreateImage(cvGetSize(img), 8, 1); float * cvGetHistValue_1D (CvHistogram*hist, int idx0)
planos[1]= cvCreateImage(cvGetSize(img), 8, 1); Para el caso de histogramas unidimensionales.
planos[2]= cvCreateImage(cvGetSize(img), 8, 1); Devuelve un puntero. Esta funcin ser til si lo que queremos es
cvCvtPixToPlane(src, planos+0, planos+1, planos+2, 0); poder modificar a mano el valor de las celdas.
cvCalcHist(planos, hist2, 0); float * cvGetHistValue_2D (CvHistogram*hist, int idx0, int idx1)
Pero, qu porras pasa con la funcin cvGetSize? Sustituir por: Para el caso de histogramas bidimensionales.
#define ggmGetSize(A) cvSize((A)->width, (A)->height) De forma similar para histogramas 3D y ND.
Procesamiento Audiovisual 107 Procesamiento Audiovisual 108
Tema 2. Procesamiento global de imgenes. Tema 2. Procesamiento global de imgenes.
18
A.2. Procesamiento global en IPL y OpenCV. A.2. Procesamiento global en IPL y OpenCV.
Existen otras operaciones interesantes de consulta y Las tablas de transformacin (look-up table, LUT) son
manipulacin de histogramas. tablas que definen funciones discretas de la forma:
Normalizar un histograma: f: [0...255] R
void cvNormalizeHist (CvHistogram* hist, double factor) Esto nos permite construir cualquier curva tonal arbitraria.
Hace que la suma de todas las celdas del histograma sea factor.
En OpenCV, una LUT es una matriz de tipo CvMat:
Puede ser interesante para visualizar o comparar histogramas.
CvMat* lut= cvCreateMat(1, 256, CV_8UC1);
Umbralizar un histograma: 1 fila y 256 columnas.
void cvThreshHist (CvHistogram* hist, double thresh)
La profundidad puede cambiar (8S, 16U, 32F, ...)
Borra todas las celdas con valor menor que thresh.
Aplicar una transformacin de tabla LUT:
Obtener mximo y mnimo de un histograma: CvMat* cvLUT (const CvArr* A, CvArr* B, const CvArr* lut)
void cvGetMinMaxHistValue (const CvHistogram* hist,
B(x,y):= lut(A(x,y))
float* minVal, float* maxVal, int* minIdx =0, int* maxIdx =0)
La imagen puede tener varios canales, pero la transformacin
Dado el histograma, calcula el mnimo (minVal), el mximo ser la misma en todos ellos.
(maxVal), el ndice de la celda mnima (minIdx) y mxima (maxIdx).
La profundidad de entrada debe ser 8 bits (con o sin signo), y
Puede ser interesante, por ejemplo, para escalar todas las celdas a la de salida (en B y en lut) puede ser cualquiera.
valores entre 0 y 1.
Procesamiento Audiovisual 109 Procesamiento Audiovisual 110
Tema 2. Procesamiento global de imgenes. Tema 2. Procesamiento global de imgenes.
A.2. Procesamiento global en IPL y OpenCV. A.2. Procesamiento global en IPL y OpenCV.
Ejemplo. Aplicar una ecualizacin del histograma de una Ejercicios.
imagen img, usando CvHist y LUT: 1. Implementar sendas operaciones para obtener el mximo y
el mnimo de dos imgenes, que trabajen con imgenes de 1
3 canales.
cvCvtColor(img, gris, CV_RGB2GRAY); 2. Escribir una funcin que realice una transformacin de
int celdas= 256; curva tonal arbitraria. Debe recibir como entrada un array de
CvHistogram* hist1= cvCreateHist(1, &celdas, CV_HIST_ARRAY); 256 bytes (la curva).
cvCalcHist(&gris, hist1, 0); 3. Implementar las operaciones de colorear una imagen, en los
cvNormalizeHist(hist1, 256.0); modos de suma o producto.
CvMat *lut= cvCreateMat(1, 255, CV_8UC1);
float acum= 0.0; 4. Escribir un programa que realice la transformacin de color
for (int i= 0; i<255; i++) {
falso, dada una imagen en escala de grises.
cvSet1D(lut, i, cvScalarAll(acum)); 5. Escribir una operacin de ecualizacin del histograma, que
acum+= cvQueryHistValue_1D(hist1, i); funcione de manera independiente por cada canal.
} 6. Implementar la transformacin de estiramiento lineal del
cvSet1D(lut, 255, cvScalarAll(255)); histograma, que permita especificar los percentiles mnimo y
cvLUT(img, imgres, lut); mximo.
7. Escribir dos operaciones para mostrar el histograma de una
imagen, de un canal slo o de dos canales conjuntos. El
resultado debe ser una imagen (IplImage).
Procesamiento Audiovisual 111 Procesamiento Audiovisual 112
Tema 2. Procesamiento global de imgenes. Tema 2. Procesamiento global de imgenes.
19