You are on page 1of 19

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 OpenCV.

Procesamiento
(c) Gins Garca Audiovisual
Mateos, http://dis.um.es/profesores/ginesgm 1 Procesamiento Audiovisual 2
Temade2.Informtica
Dept. Procesamiento global deUniversidad
y Sistemas, imgenes. de Murcia Tema 2. Procesamiento global de imgenes.

2.1. Tipos de operaciones. Histogramas. 2.1. Tipos de operaciones. Histogramas.


Pregunta: Cul es la base terica del procesamiento Principales tipos de
de imgenes? Qu operaciones aplicar? procesamientos de imgenes:
Recordatorio: una imagen digital no es ms que una Operaciones de procesamiento
matriz, o array bidimensional, de nmeros! global: cada pxel es tratado de
forma independiente, ya sea con
90 67 68 75 78 una o con varias imgenes.
92 87 73 78 82
Filtros y convoluciones: se
63 102 89 76 98
considera la vecindad local
45 83 109 80 130
de los pxeles.
39 69 92 115 154
Transformaciones geomtri-
cas: se modifica el tamao
Podemos aplicar las mismas operaciones que sobre y forma de las matrices.
cualquier nmero: sumar, restar, multiplicar, dividir, Transformaciones lineales:
aplicar and, or, mximo, mnimo, integrales, derivadas... Fourier, wavelets, etc.
Procesamiento Audiovisual 3 Procesamiento Audiovisual 4
Tema 2. Procesamiento global de imgenes. Tema 2. Procesamiento global de imgenes.

2.1. Tipos de operaciones. Histogramas. 2.1. Tipos de operaciones. Histogramas.


Operaciones de procesamiento global: Supongamos una imagen de entrada A y una
Aritmticas: sumar, restar, multiplicar, mximo, etc. imagen resultado R.
Unarias: una sola imagen y un valor constante. Una operacin global (pxel a pxel) se puede
Binarias: con dos imgenes.
expresar como una funcin:
Booleanas: and, or, not, etc.
Unarias: una sola imagen y una constante. El valor del pxel resultante es
Binarias: con dos imgenes. R(x,y):= f(A(x,y)) funcin de (y slo de) el pxel
Otras transformaciones generales: correspondiente de entrada.
Transformaciones de histograma.
Transformaciones de color. Ejemplo. Invertir. R(x,y):= 255 A(x,y)
Binarizacin, etc.
Cada operacin tendr un significado, utilidad y Imagen Imagen
A R
aplicaciones especficos. +
Procesamiento Audiovisual 5 Procesamiento Audiovisual 6
Tema 2. Procesamiento global de imgenes. 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(f1(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.

2.1. Tipos de operaciones. Histogramas. 2.1. Tipos de operaciones. Histogramas.


Los histogramas son una herramienta importante en
Algoritmo. Clculo de un histograma. anlisis de imgenes: es buena la calidad de una
imagen?, sobra luz?, falta contraste?
Entrada. A: imagen de ancho x alto Ayudan a decidir cul es el procesamiento ms
Salida. Histograma: array [0,...,255] de entero adecuado para mejorar la calidad de una imagen...
Algoritmo: Tanto cualitativamente (qu operacin aplicar),
Histograma[]:= 0 Como cuantitativamente (en qu cantidad).
En principio, una buena
para y:= 0, ..., alto-1 hacer
Frecuencia

imagen debe producir un


para x:= 0, ..., ancho-1 hacer histograma ms o menos
Histograma[A(x,y)]:= Histograma[A(x,y)]+1 uniforme y repartido en
todo el rango de valores.
0 127 255
Nivel de gris
Procesamiento Audiovisual 9 Procesamiento Audiovisual 10
Tema 2. Procesamiento global de imgenes. Tema 2. Procesamiento global de imgenes.

2.1. Tipos de operaciones. Histogramas. 2.1. Tipos de operaciones. Histogramas.


Ejemplo 1. La imagen es muy oscura. Falta luz. Ejemplo 3. La imagen tiene poco contraste.
Frecuencia

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.1. Tipos de operaciones. Histogramas. 2.2. Operaciones elementales con pxeles.


Uso de histogramas para mejorar la calidad de las imgenes.
Ejemplo. El A: imagen de entrada.
histograma R: imagen resultante (del mismo tamao que A).
indica tonos
muy oscuros.
Operaciones unarias:
Sumar una constante: R(x, y):= A(x, y) + a
Restar una constante: R(x, y):= A(x, y) - a
Multiplicar por una constante: R(x, y):= bA(x, y)
Solucin.
Aplicar un Dividir por una constante: R(x, y):= A(x, y)/b
operador Transformacin lineal genrica: R(x, y):= bA(x, y)+a
que estire
el histograma. Transformacin de gama: R(x, y):= A(x, y)c
Cualquier funcin NN: R(x, y):= f(A(x,y))
Procesamiento Audiovisual 15 Procesamiento Audiovisual 16
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.
+
Procesamiento Audiovisual 17 Procesamiento Audiovisual 18
Tema 2. Procesamiento global de imgenes. Tema 2. Procesamiento global de imgenes.

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.

Qu ocurre si se suma un valor distinto a cada canal?


Procesamiento Audiovisual 19 Procesamiento Audiovisual 20
Tema 2. Procesamiento global de imgenes. Tema 2. Procesamiento global de imgenes.

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 derecha. 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.

2.2. Operaciones elementales con pxeles. 2.3. Transformaciones del histograma.


Las transformaciones elementales se pueden ver
Dividir por una constante: R(x, y):= A(x, y) / b
como funciones f: N N.
= Multiplicar por 1/b ... obviamente! Interpretacin: para cada valor de gris de entrada
El histograma se encoge. hay un valor de salida.
255
Valor de salida
192

f: curva
128

tonal
64
0

0 64 128 192 255


Valor de entrada

Se puede usar cualquier funcin f.


La transformacin hace que se modifique el histograma.
Procesamiento Audiovisual 23 Procesamiento Audiovisual 24
Tema 2. Procesamiento global de imgenes. Tema 2. Procesamiento global de imgenes. +

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

Multiplicar 2: f(v):=2v Dividir 2: f(v):= v/2 Por 3: f(v):= 3v


Pero la transformacin tambin puede ser no lineal:
255
255
255

192
cuadrtica, polinomial, exponencial, logartmica,
192
192

escalonada, etc.
128
128
128

Cmo decidir cul es la transformacin ms


64

adecuada? Usar el histograma.


64
64

0
0
0

0 64 128 192 255 0 64 128 192 255 0 64 128 192 255


Procesamiento Audiovisual 25 Procesamiento Audiovisual 26
Tema 2. Procesamiento global de imgenes. Tema 2. Procesamiento global de imgenes.

2.3. Transformaciones del histograma. 2.3. Transformaciones del histograma.


Normalmente, interesa estirar el histograma, para Ejemplo. m= 86, M= 214
A
conseguir que aparezca todo el rango de valores. R(x,y):= (A(x,y)-86)*1,99
Idea: definir una transformacin lineal tal que el
Ojo: no
histograma resultante vaya de 0 a 255. Para imgenes en Histograma de A
necesaria-
color, se aplica la mente el
Ajuste lineal o estiramiento (stretch) del histograma: misma funcin a los mximo
Buscar el valor mnimo del histograma: m tres canales (R,G,B)
Buscar el valor mximo: M
255

Histograma de R
f(v):= (v-m)*255/(M-m) R
192
128

Nota: Esto es una


64

simple regla de 3 m M
0

0 64 128 192 255

Procesamiento Audiovisual 27 Procesamiento Audiovisual 28


Tema 2. Procesamiento global de imgenes. + Tema 2. Procesamiento global de imgenes.

2.3. Transformaciones del histograma. 2.3. Transformaciones del histograma.


Cuidado: un simple pxel con valor muy alto o muy bajo Ms ejemplos de estiramiento lineal del histograma.
puede hacer que el ajuste del histograma sea muy malo.
Por ejemplo, si hay un pxel con valor 0 y otro con 255, la
transformacin sera la identidad (la imagen no cambia).
Solucin: en lugar de mnimo y mximo, ajustar usando dos
percentiles del histograma (p. ej. 10%-90%, 5%-95%).

Histograma de A

5% 5%

Procesamiento Audiovisual 29 Procesamiento Audiovisual 30


Tema 2. Procesamiento global de imgenes. Tema 2. Procesamiento global de imgenes.

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: c1v2 + c2v + c3 Raz: c1v0.5 + c2 (parbola y raz)
f(v):= 255(v/255)1/GAMA

64
255
255
255
Valor de salida

0
192
192
192

0 64 128 192 255

128
128
128

64
64
64

0
0
0

0 64 128 192 255 0 64 128 192 255 0 64 128 192 255


Valor de entrada Valor de entrada Valor de entrada
Resultado: oscurecer Resultado: aclarar Resultado: aclarar
los medios tonos. los medios tonos. tonos oscuros y
Gama 0,5 Gama 0,75 Gama 1 Gama 2 Gama 4
oscurecer los claros.
Procesamiento Audiovisual 31 Procesamiento Audiovisual 32
Tema 2. Procesamiento global de imgenes. Tema 2. Procesamiento global de imgenes. +

2.3. Transformaciones del histograma. 2.3. Transformaciones del histograma.


La diferencia entre diferentes dispositivos Otra transformacin habitual es la ecualizacin del
(televisores, cmaras, escneres) se modela con histograma (del latn aequalis = igual).
una transformacin de gama. Ecualizacin del histograma: es una transformacin
Si el comportamiento del dispositivo fuera definida de forma que el histograma resultante se
perfectamente lineal, Gama = 1. reparte uniformemente en todo el rango de grises.
255

Blanco Negro
192

?
64 128
0

0 64 128 192 255

0 127 255 0 127 255


Dnde est el 50% de gris? Es la escala lineal?
En este caso se usa una funcin escalonada:
Dnde estara si tomramos una foto? f: array [0..255] de byte
Procesamiento Audiovisual 33 Procesamiento Audiovisual 34
Tema 2. Procesamiento global de imgenes. Tema 2. Procesamiento global de imgenes. +

2.3. Transformaciones del histograma. 2.3. Transformaciones del histograma.


Cmo definir f para conseguir la ecualizacin? Algoritmo. Clculo de la funcin de ecualizacin del
Idea: suponer que a la salida hay 5 niveles de gris. histograma.
20%
Entrada. Histograma: array [0,...,255] de entero
20% 20% np: entero (nmero total de pxeles = mx*my)
20% Salida. f: array [0,...,255] de byte
20% para todo pxel (x,y) de R hacer
R(x,y):= f[A(x,y)] Algoritmo:
f[0]:= 0 La funcin de ecualizacin es
0 127 255
acumulado:= Histograma[0] la integral del histograma,
para i:= 1, ..., 254 hacer escalada por el factor 255/np.
4

f[i]:= acumulado*255/np
3

acumulado:= acumulado + Histograma[i]


2

finpara
f[255]:= 255
1
0

0 64 128 192 255 0 1 2 3 4


Procesamiento Audiovisual 35 Procesamiento Audiovisual 36
Tema 2. Procesamiento global de imgenes. Tema 2. Procesamiento global de imgenes.

6
2.3. Transformaciones del histograma. 2.3. Transformaciones del histograma.
Imagen de entrada (A) Imagen ecualizada (R) Ejemplos. Ecualizacin del histograma.

Cada canal (R,G,B)


es ecualizado por
separado

Histograma de A Funcin f Histograma de R

Cuidado, en algunos casos los resultados pueden ser


artificiosos.
Procesamiento Audiovisual 37 Procesamiento Audiovisual 38
Tema 2. Procesamiento global de imgenes. + Tema 2. Procesamiento global de imgenes.

2.3. Transformaciones del histograma. 2.3. Transformaciones del histograma.


Umbralizacin de imgenes. En algunas Las funciones sern del estilo:
aplicaciones puede ser interesante convertir la imagen f(v):= si v > umbral1 entonces g(v)
en binaria, o recortar cierto rango de valores. sino h(v)
Las funciones tienen las siguientes formas: Transformacin de binarizacin (saturar a 0 255).
f(v):= si v < umbral entonces 0 sino 255
255
255
255
Valor de salida

Umbral Umbral Umbral Ejemplo 1. La binarizacin se suele aplicar en OCR.


192
192
192

inferior superior
128
128
128

64
64
64

0
0
0

0 64 128 192 255 0 64 128 192 255 0 64 128 192 255


Valor de entrada Valor de entrada Valor de entrada
Umbralizar la Cortar un rango y Seleccionar un
imagen con valor cte. mantener el resto rango Imagen de entrada Umbral = 160 Umbral = 215
(256 grises)
Procesamiento Audiovisual 39 Procesamiento Audiovisual 40
Tema 2. Procesamiento global de imgenes. + Tema 2. Procesamiento global de imgenes.

2.3. Transformaciones del histograma. 2.3. Transformaciones del histograma.


Ejemplo 2. Segmentacin de objetos.
Conclusiones:
Una transformacin elemental se puede ver desde
distintas perspectivas:
Como una funcin unidimensional: f: N N
Como una curva tonal.
Como una modificacin del histograma.
Imagen de entrada Umbralizar, u = 42 Umbralizar, u = 180
La caracterstica fundamental es que cada pxel se
La separacin del objeto del trata independientemente de los dems.
fondo se llama segmentacin. Los histogramas son tiles para encontrar la
La umbralizacin se puede transformacin adecuada.
usar para segmentar... En imgenes RGB, aplicamos la misma operacin a
... aunque por s sola no suele los 3 canales para que se mantenga el color.
funcionar muy bien. Cortar rango (192, 255)
Procesamiento Audiovisual 41 Procesamiento Audiovisual 42
Tema 2. Procesamiento global de imgenes. Tema 2. Procesamiento global de imgenes.

7
2.4. Combinacin de imgenes. 2.4. Combinacin de imgenes.
Combinacin de imgenes: utilizar dos o ms Operadores booleanos:
imgenes de entrada para producir una imagen de R(x, y):= A(x,y) AND B(x,y)
salida.
R(x, y):= A(x,y) OR B(x,y)
Entrada: imgenes A y B. El valor del pxel resultante es
funcin de los pxeles de A y B R(x, y):= A(x,y) XOR B(x,y)
Salida: imagen R.
en la misma posicin R(x, y):= NOT A(x,y) AND B(x,y)
En principio, todas las R(x, y):= A(x,y) OR NOT B(x,y)
R(x, y):= f(A(x,y), B(x,y))
imgenes deben ser del ...
mismo tamao
Estos operadores tienen sentido cuando al menos
Posibles operaciones de combinacin: una de las imgenes es binaria.
Booleanas: and, or, xor, not Negro (0) = FALSE
Aritmticas: suma, resta, producto/divisin, media Blanco (1 255) = TRUE
Relacionales: mximo, mnimo
Procesamiento Audiovisual 43 Procesamiento Audiovisual 44
Tema 2. Procesamiento global de imgenes. Tema 2. Procesamiento global de imgenes.

2.4. Combinacin de imgenes. 2.4. Combinacin de imgenes.


Ejemplos. Operadores booleanos. En imgenes

ARGB AND BRGB


AGris AND BGris
no binarias no
Imagen de Imagen de tienen mucho
entrada entrada sentido...
A B Cmo se
interpretan?

Las operaciones binarias aparecen en anlisis de imgenes,


A AND B A OR B A XOR B y tambin para trabajar con mscaras y recortes de
objetos.

Procesamiento Audiovisual 45 Procesamiento Audiovisual 46


Tema 2. Procesamiento global de imgenes. Tema 2. Procesamiento global de imgenes. +

2.4. Combinacin de imgenes. 2.4. Combinacin de imgenes.


1. T1:= B AND NOT C T1
Imgenes de entrada.
A B C B NOT C

2. T2:= A AND C T2
A C

Cmo conseguir el montaje de la pgina anterior?


3. R:= T1 OR T2 R
R:= (B AND NOT C) OR (A AND C) T1 T2

Procesamiento Audiovisual 47 Procesamiento Audiovisual 48


Tema 2. Procesamiento global de imgenes. Tema 2. Procesamiento global de imgenes.

8
2.4. Combinacin de imgenes. 2.4. Combinacin de imgenes.
La imagen binaria (C) se suele denominar mscara. Operaciones aritmticas:
La mscara permite segmentar el objeto de inters. R(x, y):= A(x, y) + B(x, y)
C R R(x, y):= A(x, y) - B(x, y)
R(x, y):= (A(x, y) + B(x, y))/2
R(x, y):= aA(x, y) + (1-a)B(x, y)
!? R(x, y):= A(x, y)B(x, y)c

Se usan en generacin y anlisis de imgenes.


Cuestiones: Cuidado con los problemas de saturacin.
Cmo crear la mscara de forma automtica? En imgenes binarias son equivalentes (en su
La zona del pelo no se mezcla bien con el fondo. mayora) a los operadores booleanos.
Cmo evitar este problema?
Procesamiento Audiovisual 49 Procesamiento Audiovisual 50
Tema 2. Procesamiento global de imgenes. Tema 2. Procesamiento global de imgenes.

2.4. Combinacin de imgenes. 2.4. Combinacin de imgenes.


Sumar dos imgenes: R(x, y):= A(x, y) + B(x, y) Para evitar la saturacin se puede usar la media.
Significado: mezclar las dos imgenes. Media de 2 imgenes: R(x, y):= (A(x,y)+B(x,y))/2
A A

R R

B B

Ojo: [0..255] + [0..255] = [0..510] Significado: las imgenes son


semitransparentes (al 50%).
Procesamiento Audiovisual 51 Procesamiento Audiovisual 52
Tema 2. Procesamiento global de imgenes. Tema 2. Procesamiento global de imgenes.

2.4. Combinacin de imgenes. 2.4. Combinacin de imgenes.


De forma similar, se puede definir la media ponderada. La media de imgenes se puede usar para acumular
imgenes de un vdeo.
Media ponderada: R(x,y):= aA(x,y) + (1-a)B(x,y)
Ejemplo 1. Combinar imgenes con mucho ruido de una
a = 0,25 a = 0,5 a = 0,75 escena, para obtener una mezcla con menos ruido.

La media ponderada se puede


usar para crear una transicin Imgenes
suave entre imgenes (o vdeos). capturadas Imagen
de TV acumulada
Procesamiento Audiovisual 53 Procesamiento Audiovisual 54
Tema 2. Procesamiento global de imgenes. Tema 2. Procesamiento global de imgenes.

9
2.4. Combinacin de imgenes.
2.4. Combinacin de imgenes.
Ejemplo 2. Crear un modelo de fondo de una escena, Restar dos imgenes: R(x, y):= A(x, y) - B(x, y)
acumulando varias imgenes. Significado: obtener diferencia entre imgenes.
A A-B

B-A
Modelo de B
Imgenes de fondo
Quickcam [0..255] - [0..255] =
Idea: si adems de la media en cada pxel calculamos [-255..255] La mitad
tambin la varianza, podramos tener un modelo de los pxeles se
gaussiano del fondo (N(,)). saturan a 0
Procesamiento Audiovisual 55 Procesamiento Audiovisual 56
Tema 2. Procesamiento global de imgenes. Tema 2. Procesamiento global de imgenes.

2.4. Combinacin de imgenes. 2.4. Combinacin de imgenes.


Restar dos imgenes, manteniendo el rango de Muchas veces lo que interesa es conocer la diferencia
salida: R(x, y):= (A(x, y) - B(x, y))/2 + 128 entre las imgenes. Solucin: tomar valor absoluto de
la resta.
A (A-B)* Diferencia: R(x, y):= abs(A(x, y) - B(x, y))
A R

B (B-A)* ? Son muy


distintas...
B
Pxel negro: las dos imgenes son
iguales en ese pxel.
Cuando ms clara es una zona, ms
se diferencian las imgenes.
Procesamiento Audiovisual 57 Procesamiento Audiovisual 58
Tema 2. Procesamiento global de imgenes. Tema 2. Procesamiento global de imgenes.

2.4. Combinacin de imgenes. 2.4. Combinacin de imgenes.


Aplicaciones de la diferencia: encontrar variaciones Ejemplo 2. Segmentacin del fondo de una escena.
entre imgenes que, en principio, deberan ser Tenemos un fondo (imagen media) y una nueva imagen.
parecidas.
Modelo de fondo Frame 1 Frame 2
Ejemplo 1. Analizar la prdida de informacin al
comprimir una imagen. Por ejemplo, con JPEG.
Dif.
x16

Idea: esto se
puede usar para
Dif. crear la mscara...
x16
Cmo?

Procesamiento Audiovisual 59 Procesamiento Audiovisual x2 60 x2


Tema 2. Procesamiento global de imgenes. Tema 2. Procesamiento global de imgenes.

10
2.4. Combinacin de imgenes. 2.4. Combinacin de imgenes.
Proceso. Ejemplo 3. Deteccin de movimiento en vdeo.
M
1. Obtener el modelo de fondo Dada una secuencia de vdeo, queremos saber si se
M. ha producido alguna modificacin, y en qu zonas de
A
2. Para cada imagen A del la imagen (encuentra las 7 diferencias).
vdeo. Frame 1 Frame 2 Diferencia x2
D
3. Calcular la diferencia: D =
abs(M-A).
U
4. Umbralizar la imagen con
un valor adecuado. U =
umbralizar(D, x). F
5. Sea F el nuevo fondo.
R
6. R:= (F AND NOT U) OR (A
AND U)
Cmo Qu objetos se han movido y en qu direccin?
arreglar eso?
Procesamiento Audiovisual 61 Procesamiento Audiovisual 62
Tema 2. Procesamiento global de imgenes. Tema 2. Procesamiento global de imgenes.

2.4. Combinacin de imgenes. 2.4. Combinacin de imgenes.


Producto imgenes: R(x, y):= A(x, y)B(x, y)/255 Divisin imgenes: R(x, y):= 255A(x, y)/B(x, y)
A AB A A/B

B Necesario escalar el resultado B


Tambin es necesario escalar
(dividir por 255). el resultado (multiplicar por
Efecto de mezcla, similar a la 255).
suma, pero conceptualmente Cul es interpretacin del
ms prximo a un AND... resultado?

Procesamiento Audiovisual 63 Procesamiento Audiovisual 64


Tema 2. Procesamiento global de imgenes. Tema 2. Procesamiento global de imgenes.

2.4. Combinacin de imgenes.


2.4. Combinacin de imgenes.
Ejemplo 1. Realizar una transformacin de intensidad
Estos mismos tipos de imgenes se pueden usar para
distinta para cada pxel.
hacer sumas, restas, divisiones, etc.
A B1 B2 Ejemplo. R(x, y):= A(x, y)B(x, y)/128
Si B(x, y) = 128 el pxel de A no cambia.
Si B(x, y) < 128 el pxel se oscurece.
Si B(x, y) > 128 el pxel se aclara.

A*B1 A*B2 El producto es tambin la base en la idea de mscara


o seleccin difusa.
Idea: una imagen se compone de distintos elementos o
capas, que tienen definido cierto nivel de
transparencia.
Procesamiento Audiovisual 65 Procesamiento Audiovisual 66
Tema 2. Procesamiento global de imgenes. Tema 2. Procesamiento global de imgenes.

11
2.4. Combinacin de imgenes. 2.4. Combinacin de imgenes.
Ejemplo 2. Mezcla y combinacin de imgenes. Solucin. Usar una mscara suave, una imagen en gris: 0
Queremos combinar dos imgenes, por ejemplo, para = transparente, 255 = opaco. Combinar: sumas y productos.
poner una etiqueta descriptiva en una foto. Una imagen
binaria sirve de mscara: 0 = fondo, 1 = etiqueta. M N
A B M

Resultado:
Resultado: R
R:= A(255-N)/255 + BN/255
R:= (A AND NOT M) No me convence...
OR (B AND M) mejor un reborde
Producto de
suave (difuminado)
imgenes
Procesamiento Audiovisual 67 Procesamiento Audiovisual 68
Tema 2. Procesamiento global de imgenes. Tema 2. Procesamiento global de imgenes.

2.4. Combinacin de imgenes. 2.4. Combinacin de imgenes.


Indicaciones sobre el ejemplo 2. Otras operaciones no lineales
La mascara suave es la idea del canal alfa. Mnimo de 2 imgenes. R(x, y):= min(A(x, y), B(x, y))
RGB RGBA, donde el canal A indica el grado de
opacidad de un pxel (0= transparente, 255= opaco). A B R
Uso: definimos imgenes, con sus canales alfa, y las
componemos poniendo unas sobre otras.
La composicin de imgenes con canal alfa es
bsicamente una media ponderada como hemos visto.
En el modo binario, muchas herramientas incorporan las Mximo de 2 imgenes. R(x, y):= max(A(x, y), B(x, y))
ideas de mscara, seleccin, regin de inters (cuando A B R
es rectangular) o canal de inters (en multicanal).
No necesitamos trabajar con operaciones booleanas,
aunque implcitamente es lo que hay subyacente.

Procesamiento Audiovisual 69 Procesamiento Audiovisual 70


Tema 2. Procesamiento global de imgenes. Tema 2. Procesamiento global de imgenes.

2.4. Combinacin de imgenes.


2.4. Combinacin de imgenes.
Con esto tenemos otra forma de hacer la segmentacin
Ejemplo. Una alternativa para crear modelos de fondo
de los objetos.
es usar mximos y mnimos. En lugar de tener media y
varianza, tenemos mximo y mnimo del fondo en cada Modelo de fondo Frame 1 Frame 2
pxel.
Fondo mnimo Fondo mximo

La mscara ya
est binarizada

Dada una imagen nueva, para cada pxel, comprobar si


su valor est entre el mximo y el mnimo. Si lo est:
fondo; si no lo est: objeto.
Procesamiento Audiovisual 71 Procesamiento Audiovisual 72
Tema 2. Procesamiento global de imgenes. Tema 2. Procesamiento global de imgenes.

12
2.4. Combinacin de imgenes. 2.5. Transformaciones de color.
Conclusiones: En los puntos anteriores la transformacin era la
misma para todos los canales (R, G y B).
Operaciones de combinacin: a partir de dos o ms
imgenes obtener una nueva imagen. Si es distinta, hablamos de transformacin de color:
R(x, y).R:= f1(A(x,y).R, A(x,y).G, A(x,y).B)
La operacin a aplicar depende de lo que queramos
conseguir. R(x, y).G:= f2(A(x,y).R, A(x,y).G, A(x,y).B)
R(x, y).B:= f3(A(x,y).R, A(x,y).G, A(x,y).B)
Operaciones booleanas: tiles para trabajar con
mscaras de objetos. Posibilidades:
Aplicar las mismas transformaciones que antes (suma,
Operaciones aritmticas: tiles en vdeo, modelos producto, ajuste de histograma, etc.), pero con distintos
acumulados, deteccin de movimiento, transparencias parmetros para cada canal.
difusas, etc. Transformaciones basadas en modelos de color.
En general, cualquier tipo de operacin es posible, ya Cambiar el modelo de color (RGB, HSV, HLS, XYZ,
YUV, etc.) y aplicar la funcin en ese modelo.
sean lineales o no lineales.
Procesamiento Audiovisual 73 Procesamiento Audiovisual 74
Tema 2. Procesamiento global de imgenes. Tema 2. Procesamiento global de imgenes.

2.5. Transformaciones de color. 2.5. Transformaciones de color.


Transformacin escala de grises escala de color
Conversin color escala de grises Idea: dada un imagen en gris, producir una imagen en
Conversin sencilla: escala de cierto color dado.
Pero, de
R(x, y):= (A(x,y).R + A(x,y).G + A(x,y).B)/3 dnde salen Sea A una imagen en grises y un color objetivo (vr, vg, vb).
Conversin precisa: esos pesos? La escala se puede descomponer en dos partes:

R(x, y):= 0.21A(x,y).R + 0.72A(x,y).G + 0.07A(x,y).B A

R
(0,0,0) (vr,vg,vb) (255,255,255)
Transformacin (obviamos (x,y)):
si A<128 entonces
R.R:= vrA/128; R.G:= vgA/128; R.B:= vbA/128
sino
R.R:= vr+(255-vr)(A-128)/128; R.G:= vg+(255-vg)(A-128)/128
Imagen de entrada Grises (media) Grises (precisa) R.B:= vb+(255-vb)(A-128)/128
finsi
Procesamiento Audiovisual 75 Procesamiento Audiovisual 76
Tema 2. Procesamiento global de imgenes. Tema 2. Procesamiento global de imgenes.

2.5. Transformaciones de color. 2.5. Transformaciones de color.


Ejemplo. Transformacin a sepia. Transformacin de color falso
Es una transformacin de la misma familia, cuyo objetivo es
hacer ms visibles las pequeas variaciones del nivel de
gris.
Se define una paleta de salida adecuada y una
transformacin de cada valor de gris en la paleta.
Imagen de entrada Escala de grises Escala de sepias
A
Cmo conseguir
que el punto
intermedio sea un
R= 255 0 0 255
valor cualquiera
G= 255 255 0 0
(distinto de 128)?
B= 0 0 255 255
Escala de (30,255,0) Escala de (0,255,255)
Procesamiento Audiovisual 77 Procesamiento Audiovisual 78
Tema 2. Procesamiento global de imgenes. Tema 2. Procesamiento global de imgenes.

13
2.5. Transformaciones de color. 2.5. Transformaciones de color.
Ejemplo. Transformacin de color falso. Transformaciones de agregar color (colorear)
Las transformaciones de este tipo son comunes en Idea: usar las operaciones de suma, resta y producto,
imgenes mdicas y de satlite. pero con una constante distinta por cada canal.
En estas aplicaciones, la profundidad del canal puede ser
R.R:= vr+A.R; R.G:= vg+A.G; R.B:= vb+A.B
fcilmente mayor que 1 byte. Al usar slo 256 grises se
pierde informacin. R.R:= frA.R; R.G:= fgA.G; R.B:= fbA.B
(vr, vg, vb) y (fr, fg, fb) indican el tono de color que se
da a la imagen.

Imagen de entrada

Sumar (-20, 8, 60)


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.

2.5. Transformaciones de color. 2.5. Transformaciones de color.


Transformaciones de agregar color (colorear)
Estas transformaciones estn relacionadas con el
Sumar (-10, 40, -10) Multipl. (1.4, 1.15, 1)
Multipl. (1.4, 0.9, 0.9) Imagen de entrada

balance de blancos.
Las salidas de los fotodetectores de cada canal
(R,G,B) deberan ser acordes a la apreciacin
subjetiva del color por parte del humano.
Esto implica multiplicar cada canal por un factor
adecuado.
Cuestin: qu imagen tiene los colores ms
realistas?
Ejemplos:
Priorizar rojos (medio): fr= 1.2, fg= 0.9, fb= 0.9
Priorizar verdes (mucho): fr= 0.8, fg= 1.6, fb= 0.8
Priorizar amarillos (poco): fr= 1.1, fg= 1.1, fb= 0.8

Procesamiento Audiovisual 81 Procesamiento Audiovisual 82


Tema 2. Procesamiento global de imgenes. Tema 2. Procesamiento global de imgenes.

2.5. Transformaciones de color. 2.5. Transformaciones de color.


Tambin es posible mezclar y cambiar los canales,
Finalmente, recordar que las operaciones de ajuste y
con transformaciones como las siguientes.
ecualizacin del histograma se pueden aplicar
Imagen de entrada

conjuntamente (usando el histograma de gris) o por


R.R= A.G separado (usando el histograma de cada canal).
R.G= A.B La diferencia es que mientras el primero mantiene los
R.B= A.R colores (cambia la intensidad) el segundo no los mantiene.
Los colores parecen
poco realistas

R.R=
R.R= A.B (A.R+A.B)/2
R.G= A.R R.G=
(A.G+A.R)/2
R.B= A.G
R.B=
(A.G+A.B)/2 Imagen de entrada Ajuste conjunto Ajuste separado
Procesamiento Audiovisual 83 Procesamiento Audiovisual 84
Tema 2. Procesamiento global de imgenes. Tema 2. Procesamiento global de imgenes.

14
2.5. Transformaciones de color. 2. Procesamiento global de imgenes.
Conclusiones: Conclusiones:
Las transformaciones globales se pueden realizar Procesamiento global: el valor de un pxel de salida
igual en todos los canales o con valores distintos. depende del pxel (o pxeles) correspondientes de la
En el primer caso, habr un cambio en la intensidad. imagen de entrada.
En el segundo, puede haber tambin un cambio de Operaciones aritmticas, lgicas, etc.
color. Distintas aplicaciones: mejora del histograma,
Balance de blancos: compensar los canales para reduccin de ruido, composicin de imgenes, ajuste
obtener los colores ms realistas posibles. del color, etc.
Veremos ms cuestiones relacionadas con el color Normalmente no aparecen solas, sino combinadas
cuando estudiemos espacios de color. con otros tipos de operaciones.

Procesamiento Audiovisual 85 Procesamiento Audiovisual 86


Tema 2. Procesamiento global de imgenes. Tema 2. Procesamiento global de imgenes.

A.2. Procesamiento global en OpenCV.


Anexo A.2. Operaciones de procesamiento global: Recordar: un
Procesamiento global en OpenCV. Tipos: unarias, binarias, histogramas. CvArr puede ser
un IplImage
void cvUnaria (const CvArr* A, ..., CvArr* B, ...)
void cvBinaria (const CvArr* A, const CvArr* B,.., CvArr* C, ...)
Operaciones unarias Las funciones reciben una (unarias) o dos (binarias)
Operaciones binarias imgenes de entrada, y producen una de salida. Todas ellas
Operaciones con histogramas deben estar creadas, tambin la imagen de salida.
La mayora de las funciones admite modo inplace: una
Ejercicios imagen de entrada se puede usar tambin para guardar el
resultado.
Muchas de las operaciones trabajan con ROI, COI y mask
No operan sobre toda la imagen sino slo sobre una
parte concreta (rectngulo, canal o mscara de inters).
Procesamiento Audiovisual 87 Procesamiento Audiovisual 88
Tema 2. Procesamiento global de imgenes. Tema 2. Procesamiento global de imgenes.

A.2. Procesamiento global en OpenCV. A.2. Procesamiento global en OpenCV.


Es importante observar las restricciones impuestas sobre Operaciones unarias:
las imgenes admitidas en cada funcin. cvSet, cvSetZero, cvCopy, cvAddS, cvSubS, cvSubRS,
En otro caso ocurrir un error (se produce una excepcin). cvAbsDiffS, cvAbs, cvScale, cvConvert, cvConvertScale,
cvConvertScaleAbs, cvAndS, cvOrS, cvXorS, cvNot, cvCmpS,
Normalmente:
cvThreshold, cvAdaptiveThreshold, cvMaxS, cvMinS, cvPow,
Todas las imgenes deben ser del mismo tipo: profundidad y cvLog
nmero de canales.
Operaciones binarias:
Todas las imgenes deben tener el mismo tamao. Si se
utilizan ROI, el tamao del ROI debe ser el mismo en todas. cvAdd, cvAddWeighted, cvSub, cvAbsDiff, cvMul, cvDiv,
cvAnd, cvOr, cvXor, cvCmp, cvMax, cvMin
Algunas funciones requieren imgenes con 1 solo canal.
Operaciones con histogramas:
Opcionalmente, algunas admiten el uso de una mscara
(mask), que ser otra imagen, de 8 bits y con un 1 canal. Un cvCreateHist, cvReleaseHist, cvCalcHist, cvQueryHistValue,
valor 0 significa que el pxel no se procesa, y 0 s se procesa. cvGetHistValue, cvNormalizeHist, cvGetMinMaxHistValue,
cvEqualizeHist, cvLUT
Ver la documentacin para cada funcin.

Procesamiento Audiovisual 89 Procesamiento Audiovisual 90


Tema 2. Procesamiento global de imgenes. Tema 2. Procesamiento global de imgenes.

15
A.2. Procesamiento global en OpenCV. A.2. Procesamiento global en OpenCV.
Inicializar una imagen con un valor constante:
Sumar a una imagen un valor constante:
void cvSet (CvArr* A, CvScalar S, const CvArr* mask=0)
void cvAddS (const CvArr* A, CvScalar S, CvArr* C, const CvArr* mask=0)
si mask(x,y)0 entonces A(x,y):= S
si mask(x,y)0 entonces C(x,y):= A(x,y) + S
Ejemplo. Inicializar a verde:
Ejemplo. Sumar un poco de azul: cvAddS(img, cvScalar(40,0,0), img2);
cvSet(img, cvScalar(0,255,0));
Aumentar el brillo (inplace):
Inicializar una imagen con un valor 0:
cvAddS(img, cvScalarAll(50), img);
void cvSetZero (CvArr* A) / void cvZero (CvArr* A)
Restar a una imagen un valor constante:
A(x,y):= 0
void cvSubS (const CvArr* A, CvScalar S, CvArr* C, const CvArr* mask=0)
Copiar una imagen en otra:
si mask(x,y)0 entonces C(x,y):= A(x,y) S
void cvCopy (const CvArr* A, CvArr* B, const CvArr* mask =0) Ejemplo. Disminuir el brillo:
si mask(x,y)0 entonces B(x,y):= A(x,y) cvSubS(img, cvScalarAll(50), img);
Ejemplo. Copiar un trozo de la imagen img en la imagen img2:
Restar a un valor constante una imagen :
cvSetImageROI(img, cvRect(50,50, 100, 100));
void cvSubRS (const CvArr* A, CvScalar S, CvArr* C, const CvArr* mask=0)
img2= cvCreateImage(cvSize(100, 100), img->depth, img->nChannels);
si mask(x,y)0 entonces C(x,y):= S A(x,y)
cvCopy(img, img2);
Ejemplo. Invertir una imagen (en color o B/N).
cvResetImageROI(img);
cvSubRS(img, cvScalarAll(255), img);
Procesamiento Audiovisual 91 Procesamiento Audiovisual 92
Tema 2. Procesamiento global de imgenes. Tema 2. Procesamiento global de imgenes.

A.2. Procesamiento global en OpenCV. A.2. Procesamiento global en OpenCV.


Ajuste lineal del histograma (y otros mtodos de normalizacin):
Valor absoluto de diferencia entre una imagen y un valor constante:
void cvNormalize(const CvArr* A, CvArr* C, double a, double b, CV_MINMAX)
void cvAbsDiffS (const CvArr* A , CvArr* C, CvScalar S)
hace que los pxeles de C vayan entre a y b. A y C deben ser de 1 canal
C(x,y):= |A(x,y) S|
Y lgico entre una imagen y un valor constante (a nivel de bits):
Ejemplo. cvAbsDiffS(img, img2, cvScalar(40,128,150));
void cvAndS (const CvArr* A, CvScalar S, CvArr* C, const CvArr* mask=0)
Valor absoluto de una imagen:
si mask(x,y)0 entonces C(x,y):= A(x,y) AND S
void cvAbs (const CvArr* A, CvArr* C)
O lgico entre una imagen y un valor constante (a nivel de bits):
C(x,y):= |A(x,y)|
void cvOrS (const CvArr* A, CvScalar S, CvArr* C, const CvArr* mask=0)
Tiene sentido cuando la profundidad son nmeros con signo
si mask(x,y)0 entonces C(x,y):= A(x,y) OR S
Producto/divisin de una imagen por una constante:
O exclusivo entre una imagen y un valor constante (a nivel de bits):
void cvScale (const CvArr* A, CvArr* B, double scale=1, double shift=0)
void cvXorS (const CvArr* A, CvScalar S, CvArr* C, const CvArr* mask=0)
B(x,y):= A(x,y) * scale + shift (igual para todos los canales)
si mask(x,y)0 entonces C(x,y):= A(x,y) XOR S
Se puede hacer cualquier transformacin lineal.
Negacin lgica de una imagen (a nivel de bits):
La funcin permite hacer conversiones entre imgenes con distintos
valores de profundidad (de 8 bits a 16, o a reales de 32 bits, etc). void cvNot (const CvArr* A, CvArr* C)
Tiene sinnimos, como cvConvertScale. Ver tambin cvConvertScaleAbs. C(x,y):= NOT A(x,y)
Ejemplo. Ajuste del contraste: cvConvertScale(img, img2, 1.6, -50); Ejemplo. Vale para invertir una imagen: cvNot(img, img);
Pero, para qu valen las otras operaciones booleanas con constantes?
Procesamiento Audiovisual 93 Procesamiento Audiovisual 94
Tema 2. Procesamiento global de imgenes. Tema 2. Procesamiento global de imgenes.

A.2. Procesamiento global en OpenCV. A.2. Procesamiento global en OpenCV.


Mximo entre una imagen y un valor constante:
Comparacin entre una imagen y un valor constante:
void cvMaxS (const CvArr* A, double scalar, CvArr* C) (est mal en la ayuda)
void cvCmpS (const CvArr* A, double S, CvArr* C, int cmp_op)
C(x,y):= max {A(x,y), S}
C(x,y):= A(x,y) op S, con op {=, >, <, >=, <=} Las imgenes deben ser de un solo canal.
cmp_op indica el modo de comparacin: CV_CMP_EQ (igual), Mnimo entre una imagen y un valor constante:
CV_CMP_GT (mayor que), CV_CMP_GE (mayor o igual), etc.
void cvMinS (const CvArr* A, double scalar, CvArr* C) (est mal en la ayuda)
El resultado es una imagen binaria, con 0 255 (todos los bits a 1).
C(x,y):= min {A(x,y), S}
Ver tambin la funcin cvInRangeS(img, scalar1, scalar2, res).
Las imgenes deben ser de un solo canal.
Umbralizacin/binarizacin de una imagen:
void cvThreshold (const CvArr* src, CvArr* dst, double threshold, Potencia, exponencial y logaritmo de los pxeles de una imagen:
double maxValue, int thresholdType) void cvPow (const CvArr* A, CvArr* C, double p) C(x,y):= A(x,y)p
Umbraliza la imagen segn el mtodo dado en thresholdType. y el void cvExp (const CvArr* A, CvArr* C) C(x,y):= eA(x,y)
umbral es threshold. void cvLog (const CvArr* A, CvArr* C) C(x,y):= loge |A(x,y)|
P.ej., CV_THRESH_BINARY para binarizar: Para evitar saturacin y prdida de informacin, es conveniente
C(x,y):= si A(x,y) > threshold entonces maxValue sino 0 transformar las profundidad a reales de 32 o 64 bits.
La umbralizacin se hace con un valor constante. Para un mtodo ms Ejemplo. Transformacin de gamma:
avanzado ver cvAdaptiveThreshold. El umbral se calcula para cada cvConvertScale(img, imr, 1./255, 0); // imr es de profundidad 32F
pxel, usando una vecindad local (adaptativo). cvPow(imr, imr, gamma);
cvConvertScale(imr, img, 255., 0);
Procesamiento Audiovisual 95 Procesamiento Audiovisual 96
Tema 2. Procesamiento global de imgenes. Tema 2. Procesamiento global de imgenes.

16
A.2. Procesamiento global en OpenCV. A.2. Procesamiento global en OpenCV.
Operaciones Binarias Restar dos imgenes:
Sumar dos imgenes: void cvSub (const CvArr* A, const CvArr* B, CvArr* C, const CvArr* mask=0)
si mask(x,y)0 entonces C(x,y):= A(x,y) - B(x,y)
void cvAdd (const CvArr* A, const CvArr* B, CvArr* C, const CvArr* mask=0)
Las imgenes deben tener el mismo tamao (o ROI) y el mismo tipo.
si mask(x,y)0 entonces C(x,y):= A(x,y) + B(x,y)
Igual que antes, tener cuidado con los problemas de saturacin.
Las imgenes deben tener el mismo tamao (o ROI) y el mismo tipo.
Esta operacin tiene ms sentido cuando se usan tipos con signo (16S,
Ojo: recordar los problemas de saturacin. Por ejemplo, para obtener la
16F, 32F).
media de dos imgenes, im1, im2:
cvScale(im1, im1, 0.5, 0);
cvScale(im2, im2, 0.5, 0); // Qu pasa si hacemos primero la suma Diferencia absoluta entre dos imgenes:
cvAdd(im1, im2, imr, 0); // y luego la divisin por 2? void cvAbsDiff (const CvArr* A, const CvArr* B, CvArr* C)
Suma ponderada de dos imgenes: C(x,y):= |A(x,y) - B(x,y)|
void cvAddWeighted(CvArr* A, double a, CvArr* B, double b, double g, CvArr* C) Ms adecuada cuando tenemos imgenes sin signo y solo queremos
C(x,y):= aA(x,y) + bB(x,y) + g medir diferencias absolutas entre pxeles.
Las mismas restricciones que antes.
Es mucho ms adecuada para calcular la media de dos imgenes:
cvAddWeighted(im1, 0.5, im2, 0.5, 0, imr);

Procesamiento Audiovisual 97 Procesamiento Audiovisual 98


Tema 2. Procesamiento global de imgenes. Tema 2. Procesamiento global de imgenes.

A.2. Procesamiento global en OpenCV. A.2. Procesamiento global en OpenCV.


Y lgico, a nivel de bits, entre dos imgenes:
Multiplicar dos imgenes:
void cvAnd (const CvArr* A, const CvArr* B, CvArr* C, const CvArr* mask=0)
void cvMul (const CvArr* A, const CvArr* B, CvArr* C, double scale=1)
si mask(x,y)0 entonces C(x,y):= A(x,y) AND B(x,y)
C(x,y):= A(x,y)*B(x,y)*scale
Tambin funciona con nmeros reales, pero para qu puede valer?
El valor scale permite evitar problemas de saturacin.
Para que tenga sentido, al menos alguna de las dos imgenes debera
Ejemplo: multiplicar dos imgenes de 8 bits:
ser binaria (0/255).
cvMul(im1, im2, imr, 1./255);

O lgico, a nivel de bits, entre dos imgenes:


Dividir dos imgenes:
void cvOr (const CvArr* A, const CvArr* B, CvArr* C, const CvArr* mask=0)
void cvDiv (const CvArr* A, const CvArr* B, CvArr* C, double scale=1)
si mask(x,y)0 entonces C(x,y):= A(x,y) OR B(x,y)
C(x,y):= scale*A(x,y)/B(x,y)
A puede ser nulo, en cuyo caso se supone que todos los pxeles son 1.
Igual que antes, tener cuidado con los problemas de saturacin. Es ms
O exclusivo, a nivel de bits, entre dos imgenes:
adecuado usar enteros con signo. void cvXor (const CvArr* A, const CvArr* B, CvArr* C, const CvArr* mask=0)
Ejemplo: si mask(x,y)0 entonces C(x,y):= A(x,y) XOR B(x,y)
cvDiv(im1, im2, imr, 255.0);

Procesamiento Audiovisual 99 Procesamiento Audiovisual 100


Tema 2. Procesamiento global de imgenes. Tema 2. Procesamiento global de imgenes.

A.2. Procesamiento global en OpenCV. A.2. Procesamiento global en 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); #define CM(a,b,n) (a*(255-n)+b*n)/255.0
Mximo de dos imgenes: CvScalar pA, pB, pN, pR;
cvNot(N, N);
void cvMax (const CvArr* A, const CvArr* B, CvArr* C) for (int y=0; y<A->height; y++)
C(x,y):= max {A(x,y), B(x,y)}
cvMul(A, N, A, 1./255); for (int x= 0; x<A->width; x++) {
Las imgenes deben tener 1 solo canal. cvAdd(A, B, R); pA= cvGet2D(A, y, x);
pB= cvGet2D(B, y, x);
Mnimo de dos imgenes: pN= cvGet2D(N, y, x);
void cvMin (const CvArr* A, const CvArr* B, CvArr* C) Esto es ms sencillo y pR.val[0]= CM(pA.val[0],pB.val[0],pN.val[0]);
C(x,y):= min {A(x,y), B(x,y)} eficiente, porque las opera- pR.val[1]= CM(pA.val[1],pB.val[1],pN.val[1]);
Las imgenes deben tener 1 solo canal. ciones estn optimizadas pR.val[2]= CM(pA.val[2],pB.val[2],pN.val[2]);
cvSet2D(R, y, x, pR);
Aunque no del todo correcto, }
modifica sus parmetros de Esto es menos eficiente (~5 veces
Procesamiento Audiovisual 101 ms lento) y menos recomendable
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 OpenCV. A.2. Procesamiento global en OpenCV.
Propiedades de un histograma:
Operaciones con histogramas Nmero de dimensiones. Normalmente tendremos 1
En OpenCV se define el tipo CvHistogram y las dimensin (escala de grises), 2 dimensiones (histogramas
operaciones para manejarlo: cvCreateHist, cvReleaseHist, conjuntos de dos canales) o como mucho 3.
cvCalcHist, cvQueryHistValue, cvGetHistValue, Para cada dimensin, nmero de celdas (bins). Normalmente
cvNormalizeHist, cvThreshHist, cvGetMinMaxHistValue. ser una potencia de 2, como 256, 64, 32...
Rango de valores correspondientes a cada celda, en el caso
Tenemos tambin una operacin de ecualizacin del
de haber menos celdas que valores (normalmt. ser uniforme).
histograma: cvEqualizeHist.
Ejemplos. Histograma de 2 dimensiones
Otra cuestin relacionada son las tablas de
transformacin (look-up table, o LUT), para realizar una Histograma de 1 Bin 0 Bin 1
transformacin de curva tonal arbitraria. dimensin y 4 celdas (0-127) (128-255)

Bin 0 Bin 1 Bin 2 Bin 3 Bin 0 (0-85)


(0-63) (64-127) (128-191) (192-255) Bin 1 (86-170)
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 OpenCV. A.2. Procesamiento global en OpenCV.


Crear un histograma: Ejemplo. Crear un histograma con 2 dimensiones y 32 celdas en cada
dimensin:
CvHistogram* cvCreateHist (int dims, int* sizes, int type,
CvHistogram* hist2;
float** ranges=0, int uniform=1) int celdas[2]= {32, 32};
dims: nmero de dimensiones del histograma. hist2= cvCreateHist(2, celdas, CV_HIST_ARRAY);
sizes: 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 acumulate=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.
CvHistogram* hist1; acumulate: si se pone a TRUE, no borra el contenido anterior de las
celdas. Esto permite obtener histogramas acumulados de varias
int celdas= 256; 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 OpenCV. A.2. Procesamiento global en 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)
Para el caso de histogramas unidimensionales.
Ejemplo 1. Calcular el histograma unidimensional del nivel de gris: Realmente no es una funcin sino un macro.
IplImage *gris= cvCreateImage(cvGetSize(img), 8, 1); // Ver abajo float cvQueryHistValue_2D (CvHistogram*hist, int idx0, int idx1)
cvCvtColor(img, gris, CV_RGB2GRAY); Para el caso de histogramas bidimensionales.
cvCalcHist(&gris, hist1, 0); De forma similar para histogramas 3D y ND.
Obtener un puntero a una celda del histograma:
Ejemplo 2. Calcular el histograma bidimensional de los canales R y G: float * cvGetHistValue_1D (CvHistogram*hist, int idx0)
IplImage *planos[3]; Para el caso de histogramas unidimensionales.
planos[0]= cvCreateImage(cvGetSize(img), 8, 1); Devuelve un puntero. Esta funcin ser til si lo que queremos es
planos[1]= cvCreateImage(cvGetSize(img), 8, 1); poder modificar a mano el valor de las celdas.
planos[2]= cvCreateImage(cvGetSize(img), 8, 1); float * cvGetHistValue_2D (CvHistogram*hist, int idx0, int idx1)
cvSplit(src, planos+0, planos+1, planos+2, 0); Para el caso de histogramas bidimensionales.
cvCalcHist(planos, hist2, 0); 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 OpenCV. A.2. Procesamiento global en 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_8UC3);
Obtener mximo y mnimo de un histograma: 1 fila y 256 columnas. Tantos canales como la salida (C1, C3).
void cvGetMinMaxHistValue (const CvHistogram* hist, La profundidad puede cambiar (8S, 16U, 32F, ...)
float* minVal, float* maxVal, int* minIdx =0, int* maxIdx =0)
Aplicar una transformacin de tabla LUT:
Dado el histograma, calcula el mnimo (minVal), el mximo
(maxVal), el ndice de la celda mnima (minIdx) y mxima (maxIdx).
CvMat* cvLUT (const CvArr* A, CvArr* B, const CvArr* lut)
Interesante, p.ej., para escalar todas las celdas entre 0 y 1.
B(x,y):= lut(A(x,y))
La imagen A puede tener 1 o varios canales. B y lut deben
Ecualizar el histograma de una imagen: tener el mismo nmero y la misma profundidad.
void cvEqualizeHist (const CvArr* src, CvArr* dst)
La profundidad de entrada, A, debe ser 8 bits (con o sin
Ojo: la imagen debe ser de 1 solo canal y 8U. No se puede usar signo), y la de salida (en B y en lut) puede ser cualquiera.
para hacer una ecualizacin conjunta de RGB.
Procesamiento Audiovisual 109 Procesamiento Audiovisual 110
Tema 2. Procesamiento global de imgenes. Tema 2. Procesamiento global de imgenes.

A.2. Procesamiento global en OpenCV. A.2. Procesamiento global en OpenCV.


Ejemplo 2. Media ponderada entre dos imgenes. En un proyecto
Ejemplo 1. Aplicar una ecualizacin conjunta del histograma nuevo, crear un botn y aadir el siguiente cdigo.
a una imagen img (existente) usando CvHist y LUT: int peso= 50;
IplImage *ent1, *ent2, *sal;
IplImage *gris= cvCreateImage(cvGetSize(img), img->depth, 1);
cvCvtColor(img, gris, CV_RGB2GRAY); void on_trackbar(int nada) Fuera del slot
int celdas= 256; {
cvAddWeighted(ent1, peso/100.0, ent2, 1.0-peso/100.0, 0, sal); del botn
CvHistogram* hist1= cvCreateHist(1, &celdas, CV_HIST_ARRAY); cvShowImage("Imagen", sal);
cvCalcHist(&gris, hist1); }
cvNormalizeHist(hist1, 256.0); void MainWindow::on_pushButton_clicked(){
CvMat *lut= cvCreateMat(1, 256, CV_8UC3); ent1= cvLoadImage("encolor1.bmp", 1);
float acum= 0.0; IplImage *tmp= cvLoadImage("encolor2.bmp", 1);
if (!ent1 || !tmp) return;
for (int i= 0; i<255; i++) { ent2= cvCloneImage(ent1);
cvSet1D(lut, i, cvScalarAll(acum)); cvResize(tmp, ent2);
cvReleaseImage(&tmp);
acum+= cvQueryHistValue_1D(hist1, i); sal= cvCloneImage(ent1); Dentro del slot
} cvNamedWindow("Imagen", 0); del botn
cvSet1D(lut, 255, cvScalarAll(255)); cvCreateTrackbar("Peso", "Imagen", &peso, 100, on_trackbar);
on_trackbar(50);
cvLUT(img, img, lut); cvWaitKey(0);
cvReleaseHist(&hist1); cvReleaseImage(&ent1);
cvReleaseImage(&ent2);
cvReleaseMat(&lut); cvReleaseImage(&sal);
cvReleaseImage(&gris); cvDestroyWindow("Imagen");
}
Procesamiento Audiovisual 111 Procesamiento Audiovisual 112
Tema 2. Procesamiento global de imgenes. Tema 2. Procesamiento global de imgenes.

19