Detección de Bordes en Imágenes Digitales
Detección de Bordes en Imágenes Digitales
Características en una imagen tales como bordes y contornos, los cuales son detectados a través de
cambios locales de intensidad o de color, juegan un papel importante en la interpretación de
imágenes. La subjetiva "claridad" de una imagen se encuentra en relación directa con las
discontinuidades y nitidez de las estructuras presentes en la misma. El ojo humano da un peso
importante a los bordes de los objetos, tal que sencillos trazos en imágenes son suficientes para
interpretar las clases de los objetos presentes. Por esta razón son los bordes y los contornos un tema
muy importante para el procesamiento de imágenes digitales y la visión artificial. En este capítulo se
hace un tratamiento de los principales métodos existentes para la localización de bordes.
6.1. ¿Cómo se producen los contornos?
Los bordes tienen un predominante rol en la visión humana y probablemente también en otros
sistemas biológicos de visión. los bordes no solamente son notables, sino también es posible
mediante pocas líneas de bordes reconstruir nuevamente a los objetos. (Figura 6.1)
Pero de todo esto, ¿cómo se originan estos bordes y como técnicamente es posible
localizarlos en las imágenes?
Los bordes a grosso modo pueden ser considerados como puntos en una imagen en los
cuales la intensidad en una determinada dirección cambia drásticamente. Dependiendo del
cambio presentado en la intensidad será el valor del borde en la imagen para ese punto. El
tamaño del cambio es calculado normalmente a partir de la derivada, y es utilizada como uno
de los enfoques más importantes para la determinación de los bordes en una imagen.
1
Figura 6.2 Primera derivada en el caso unidimensional obtenido a partir del perfil horizontal de la
imagen. Imagen original (a) y la derivada f'(u) del perfil horizontal
obtenido de la imagen
Es conocido que la derivada de una función continua en un punto x, puede ser interpretada
por la pendiente de la tangente en ese punto en particular. Sin embargo, para la función
discreta la derivada en un punto u (la pendiente de la tangente a ese punto) puede ser
calculada a partir de la diferencia existente entre los puntos vecinos a “u” dividido por el valor
de muestreo entre ambos puntos. Por lo que la derivada puede ser aproximada por
𝑑𝑓 𝑓(𝑢 + 1) − 𝑓(𝑢 − 1)
(𝑢) ≈
𝑑𝑢 2 6.2
= 0.5 ∙ (𝑓(𝑢 + 1) − 𝑓(𝑢 − 1))
El mismo proceso también puede ser llevado a cabo para el sentido vertical a lo largo de la
columna de la imagen.
Figura 6.3 Cálculo de la primera derivada para una función discreta. La pendiente de la línea a
través de los puntos vecinos f(u-1) y f(u+1) sirve como cálculo indirecto de la pendiente a la tangente
en f(u). El cálculo es lo suficientemente aproximado en la mayoría de los casos que pudieran
presentarse
2
𝜕𝐼
(𝑥, 𝑦)
𝜕𝑥 6.3
∇𝐼(𝑥, 𝑦) = 𝜕𝐼
(𝑥, 𝑦)
[𝜕𝑦 ]
Representa el vector del gradiente de la función I en el punto (x, y). El valor del gradiente
𝜕𝐼 2 𝜕𝐼 2
|∇𝐼 | = √( ) + ( ) 6.4
𝜕𝑥 𝜕𝑦
donde el coeficiente -0.5 afecta al píxel 𝐼(𝑥 − 1, 𝑦) y 0.5 al píxel 𝐼(𝑥 + 1, 𝑦). El valor del píxel
de en medio 𝐼(𝑥, 𝑦) es multiplicado por cero o de igual manera ignorado (aquí se considera
que el elemento bajo el cual se calcula la propiedad en cuestión). De igual manera al
establecer el mismo efecto de filtro, pero en sentido vertical, siendo la siguiente matriz de
coeficientes
−0.5 −1
𝐻𝑦𝐷 = [ 0 ] = 0.5 [ 0 ] 6.6
0.5 1
3
Figura 6.4 La primera derivada parcial. (a) Imagen sintética, (b) primera derivada
parcial sobre el sentido horizontal Ə𝑙 𝑑𝑢, (c) sobre el sentido vertical Ə𝑙/𝑑𝑣, (d) valor
del gradiente |𝛻𝐼 |. En (b) y (c) son los valores oscuros pertenecientes a valores negativos,
los valores más brillantes pertenecientes a valores positivos mientras que el gris
corresponde al cero
Los operadores Prewitt y Sobel representan dos de los métodos más usados en la
detección de bordes, los cuales son muy similares entre si diferenciándose solamente por
algunas particularidades.
[Link]. El Filtro
Ambos operadores utilizan filtro de 3x3, esto facilita la configuración del filtro que no
sea vulnerable al ruido propio de la imagen. El operador Prewitt utiliza el filtro
definido por:
6.7
−1 0 1 −1 −1 −1
𝑃 𝑃
𝐻𝑥 = [−1 0 1] y 𝐻𝑦 = [ 0 0 0]
−1 0 1 1 1 1
El cual es evidentemente aplicado sobre los diferentes vecinos del píxel en cuestión.
Si se analiza el filtro en su forma separada
1 −1
𝐻𝑥𝑃 = [1] ∗ [−1 0 −1] o bien 𝐻𝑦𝑃 = [1 1 1] ∗ [ 0 ] 6.8
1 −1
4
seria claro que cada uno de los vectores de la derecha ya sea para el caso de 𝐻𝑥𝑃 o
𝐻𝑦𝑃 produce tres columnas o renglones que constituyen los coeficientes del filtro
definido en la ecuación 6.8, sin embargo, como puede observarse este vector
[−1 0 −1] mantiene la aproximación de la derivada definida en la sección 6.2.2.
También es posible notar como el vector de la izquierda [1 1 1] en ambos casos
implica una operación de suavizado de los datos, mostrando así cómo el filtro aparte
de localizar o realzar los pixeles pertenecientes a los bordes, realiza una operación
de suavizado, que permite hacer más robusto el filtro, al ruido presente en la imagen.
El operador de Sobel tiene un filtro prácticamente idéntico al Prewitt, con la única
diferencia de que en este filtro se le da un mayor peso al renglón o columna central
del filtro. La matriz de coeficientes para este operador es definida como
−1 0 1 −1 −2 −1
𝐻𝑥𝑆 = [−2 0 𝑆
2] y 𝐻𝑦 = [ 0 0 0] 6.9
−1 0 1 1 2 1
Los resultados de los filtros de Prewitt y Sobel producen estimaciones del gradiente
local para todos los pixeles de la imagen en sus dos diferentes direcciones,
manteniendo la siguiente relación
𝑃 𝑆
1 𝐻𝑥 ∙ 𝐼 1 𝐻𝑥 ∙ 𝐼
𝛻𝐼(𝑥, 𝑦) = [ 𝑃 ] y 𝛻𝐼(𝑥, 𝑦) = [ 𝑆 ] 6.10
6 𝐻𝑦 ∙ 𝐼 8 𝐻𝑦 ∙ 𝐼
La magnitud del borde 𝐸(𝑢, 𝑣) es en ambos casos definida como la magnitud del
gradiente
2
𝐸(𝑥, 𝑦) = √(𝐷𝑥 (𝑥, 𝑦))2 + (𝐷𝑦 (𝑥, 𝑦)) 6.12
La figura 6.5 muestra la representación del tamaño y dirección del gradiente sobre
una imagen. El proceso completo para la detección de bordes es de nueva cuenta
resumido en la figura 6.6. Primero la imagen original es filtrada a través de las dos
matrices de coeficientes 𝐻𝑥 y 𝐻𝑦 y consecuentemente sus resultados son reunidos
en la magnitud del gradiente 𝐸(𝑥, 𝑦) y en la dirección de este mismo 𝜙(𝑥, 𝑦).
5
Figura 6.5 Representación de la magnitud gradiente 𝐸(𝑥, 𝑦) y si dirección 𝜙(𝑥, 𝑦)
Figura 6.6 Operación típica de los filtros utilizados para la detección de bordes. Con
ambas matrices de coeficientes 𝐻𝑥 y 𝐻𝑦 son producidas las imágenes de gradientes
𝐷𝑥 y 𝐷𝑦 y con ellas son calculados la magnitud del gradiente 𝐸(𝑥, 𝑦) y 𝜙(𝑥, 𝑦) su
dirección
El cálculo de la dirección del gradiente utilizando el operador Prewitt y la versión
original del operador Sobel es relativamente imprecisa, por ello se sugiere en lugar de
utilizar el filtro Sobel presentado en la ecuación 6. 10 utilizar la versión que minimiza
el error de ángulo, definida por
−3 0 3 −3 10 −3
1 1
𝐻𝑥𝑆′ = [−10 0 10] y 𝐻𝑦𝑆′ = 32 [ 0 0 0] 6.14
32
−3 0 3 3 10 3
Este filtro reacciona particularmente a los bordes de la imagen que tienen una dirección
diagonal (figura 6.7), sin embargo, ello hace que el filtro sea poco selectivo en la dirección del
gradiente, principalmente cuando éste se calcula sobre regiones con una misma orientación.
La magnitud del gradiente se calcula como fue definido en la ecuación 6.5, considerando
ambas componentes 𝐻1𝑅 y 𝐻2𝑅 sin embargo, debido a la operación diagonal del filtro sobre los
6
datos, puede considerarse que la magnitud del gradiente se forma como la resultante de dos
vectores (𝐻1𝑅 y 𝐻2𝑅 ) que se encuentran a 45°. La figura 6.8 esquematiza esta operación.
Figura 6.7 Componentes diagonales del operador Roberts. De las imágenes es fácil reconocer el
carácter direccional en el cálculo de este operador para encontrar la magnitud del gradiente en cada
píxel de la imagen
Figura 6.8 Magnitud del gradiente considerando el operador Roberts La magnitud del
gradiente 𝐸(𝑥, 𝑦) es calculado como la suma de los dos filtros ortogonales 𝐻1𝑅 y 𝐻2𝑅 que se aplican
para cada dirección de la diagonal
7
cual cuenta con ocho diferentes filtros, cada uno separado del otro por 45°. Las matrices de
coeficientes de este operador son las siguientes:
−1 0 1 −2 −1 0 −1 −2 −1 0 −1 −2
𝐻0𝐾 = [−2 0 2],𝐻1𝐾 = [−1 0 1], 𝐻2𝐾 = [ 0 0 0 ], 𝐻3𝐾 = [1 0 −1]
−1 0 1 −0 1 2 −1 0 1 2 1 0
6.16
1 0 −1 2 1 0 1 2 1 0 1 2
𝐻4𝐾 = [2 0 −2], 𝐻5𝐾 = [1 0 −1], 𝐻6𝐾 = [ 0 0 0 ], 𝐻7𝐾 = [−1 0 1]
1 0 −1 0 −1 0 −1 −2 −1 −2 −1 0
De estos 8 filtros 𝐻0𝐾 , 𝐻1𝐾 , . . . , 𝐻8𝐾 se deben calcular, sin embargo, solo cuatro, debido a que los
últimos cuatro son iguales a los cuatro primeros excepto en el signo. Por ejemplo, se tiene
que 𝐻4𝐾 = 𝐻0𝐾 . Debido a la propiedad de linealidad de la convolución, es evidente que:
Las imágenes producidas por la operación de los filtros de Kirsch 𝐷0 , 𝐷1 , . . . , 𝐷7 son producidas
de la siguiente manera:
La dirección del gradiente queda determinada por el filtro que aporta el máximo en el cálculo
de la magnitud del gradiente. Por lo que la dirección del gradiente queda especificada por:
𝜋
𝜙 𝐾 (𝑥, 𝑦) = 𝑙 donde 𝑙 = 𝑎𝑟𝑔𝑚𝑎𝑥 (𝐷𝑖 (𝑥, 𝑦)) 6.21
4 0≤𝑖≤7
En términos prácticos, las ventajas de los resultados ofrecidos por los operadores complejos
(como el operador Kirsch) apenas son perceptibles en comparación con operadores más
simples como el Sobel. Quizá una ventaja interesante de este operador sea el hecho de no
necesitar el cálculo de la raíz cuadrada para la determinación de la magnitud del gradiente (al
emplear en su lugar el máximo), lo cual puede representar una ventaja cuando se dispone de
recursos de cómputo limitados.
9
% Se crean las matrices con ceros para almacenar los gradientes
Gx = zeros(size(Imagen));
Gy = zeros(size(Imagen));
% SEGUNDA PARTE
% Se calcula la magnitud del gradiente
% (véase ecuación 6.11)
Gt = sqrt(Gx.^2 + Gy.^2);
% Se normaliza el gradiente
GtN = (Gt / VmaxGt) * 255;
% TERCERA PARTE
% Se binariza la imagen, utilizando un umbral de 100
B = GtN > 100;
% Se normaliza Gx y Gy
GradOffX = Gx - VminGx;
GradOffY = Gy - VminGy;
−1 0 1 −1 −2 −1
𝐻𝑥𝑆 = [−2 0 2] 𝐻𝑦𝑆 = [ 0 0 0]
Sobel sobel −1 0 1 1 2 1
0 1 1 0
Roberts roberts 𝐻1𝑅 = [ ] 𝐻2𝑅 = [0 1]
−1 0
Los parámetros de esta función son idénticos a los indicados en el caso Sobel.
El operador Prewitt es un poco más simple (computacionalmente hablando) de
ser implementado con relación al caso Sobel. Sin embargo, los resultados
obtenidos son un poco más ruidosos, ya que, en el caso de Sobel, de acuerdo
con los coeficientes implementados en sus filtros, realiza un suavizado sobre
los datos, lo cual puede ser observado en los coeficientes con valor 2 en el
renglón o columna del píxel sobre el cual se desea calcular el gradiente.
El operador Roberts utiliza los filtros definidos en la tabla 6.1 para aproximar el
cálculo del gradiente en el píxel (𝑢, 𝑣). La llamada general a la función edge
con este método es:
Los parámetros de esta función son idénticos a los descritos en el caso del
operador Sobel. El operador Roberts representa uno de los métodos más
antiguos para el cálculo del gradiente en imágenes. Aunque este método es
más sencillo de implementar, tiene una limitación funcional, ya que al ser no
simétrico no puede detectar bordes que se encuentren direccionalmente en
múltiples posiciones de 45º. A modo de comparación, la figura 6.10 muestra el
resultado de aplicar las diferentes funciones para detectar bordes en una
imagen, utilizando el mismo umbral para todos los casos.
12
Figura 6.10 Comparación de los diferentes operadores utilizados para la detección de bordes,
utilizando la función edge de MatLAB. (a) Imagen original, (b) hordes detectados por el operador
Sobel, (c) Prewitt y (d) Roberts. En todos los casos se utilizó un umbral=0.02
Los bloques implementados de procesamiento de imágenes y vídeo para trabajar en un
ambiente de Simulink permiten realizar operaciones directamente sobre imágenes o vídeos,
interconectando bloques como es la filosofía en Simulink, para llevar a cabo el procesamiento
indicado sobre las imágenes. En el caso de detección de bordes, la librería de Simulink
implementa el bloque 'Edge Detection', el cual permite encontrar los bordes de una imagen o
de frames de vídeo, utilizando para ello los operadores Sobel, Prewitt y Roberts mencionados
anteriormente en este capítulo. La Figura 6.11 muestra el bloque 'Edge Detection' de Simulink.
Figura 6.11 Bloque para la detección de bordes en imágenes o frames de video, como parte de la
librería de procesamiento de imagen y video de Simulink. El operador por defecto de este bloque es el
Sobel
13
2. La imagen de salida, donde se especifican 3 diferentes opciones: a) Binary
image: Especificando esta opción, estamos estableciendo que, como salida de
este bloque, tendremos la imagen binaria donde el píxel en uno corresponde al
borde, mientras que los píxeles en cero corresponden a puntos no-bordes. b)
Gradient components: Con esta opción, aparecerán realmente dos salidas (Gh
y Gv) en el bloque, las cuales corresponden a las salidas provocadas por cada
uno de los filtros de los que se componen cada uno de los operadores, que son
las imágenes de los gradientes en cada una de las dos direcciones. c) Binary
image and Gradient components: Con esta opción, aparecerán tres diferentes
salidas en el bloque, las cuales corresponderán a la imagen que contiene los
bordes (la imagen binaria), las imágenes correspondientes a cada una de las
direcciones del gradiente (Gh, Gv).
3. El valor del umbral, el cual especifica el valor a partir del cual el gradiente de
un píxel es considerado como un borde en la imagen. Para poder definir este
valor, habrá que señalar la opción "User-defined threshold".
4. Ancho del borde, Con esta opción, el usuario puede definir los bordes que son
muy anchos para reducirlos a un solo píxel. Esta opción es particularmente
atractiva para aumentar la legibilidad de la imagen obtenida."
Figura 6.12 Mascarilla principal del bloque “Edge Detection”, desglosada por los campos de
configuracion
Figura 6.13 Proceso para encontrar los bordes de una imagen, utilizando las
librerías de bloques para el procesamiento de imagen y video de Simulink. En el
ejemplo se utiliza como operador que aproxima el valor del gradiente el Prewitt
14
Como muestra la Figura 6.13, el sistema consta de diferentes bloques.
El primero, "Image From File", permite tomar una imagen de un
archivo. Dado que esta imagen está en formato RGB, es necesario
convertirla a una imagen de intensidad (escala de grises). La
operación de conversión de una imagen RGB a escala de grises u
otros modelos de color es realizada por el bloque "Color Space
Conversion". Una vez disponible la imagen en escala de grises, se
utiliza el bloque "Edge Detection", el cual se configura tal y como se
trató en el apartado anterior. Específicamente en la Figura 6.12 se
utilizó como operador el Prewitt. Por último, el resultado de la imagen
binaria obtenida del bloque "Edge Detection" se despliega en la
consola con el bloque "Video Viewer".
15
Una vez establecido el sistema de procesamiento como se muestra en
la Figura 6.13 y configurado el ambiente, se procede a establecer el
procesamiento de la imagen. Para ello, sólo es necesario pulsar el
botón de inicio, a partir del cual iniciará la operación del algoritmo
programado. La Figura 6.15 muestra el resultado de la utilización del
bloque "Edge Detection" sobre una imagen utilizando el operador
Prewitt y un umbral de 0.2.
Figura 6.15 resultado de utilizar el bloque de detección de bordes sobre una imagen
utilizando Prewitt y un umbral de 0.2Principio del formulario
Otra opción para detectar los bordes de una imagen es programar directamente
los filtros correspondientes al operador en cuestión en Simulink, tal como se
describen en la tabla 6.1. Sin embargo, esto implicaría un trabajo adicional, ya
que la idea sería programar lo que ya está implementado internamente en el
bloque "Edge Detection". Aunque esto pueda parecer redundante, el hecho de
programar directamente las estructuras podría ser un ejercicio interesante de
programación en Simulink y permitiría ganar flexibilidad en la utilización de
operadores, pudiendo así programar otros filtros utilizados para la detección de
bordes que no estén implementados en el bloque "Edge Detection", como por
ejemplo el filtro Kirsch (véase la subsección 6.3.3). Esta sección es importante
ya que representa el desarrollo de una estructura de programa de Simulink
estándar utilizada en este libro, no solo para la detección de bordes, sino
también para otras aplicaciones donde se utiliza el filtrado espacial.
Para llevar a cabo el programa en Simulink que determine los bordes de una
imagen mediante la programación directa del operador, es necesario describir
la utilización de algunos bloques funcionales que forman parte de la librería de
bloques para el procesamiento de imágenes y vídeo.
16
Figura 6.16 Bloque de Simulink para añadir una matriz o imagen al algoritmo de
procesamiento de imagen. El bloque por defecto inicializa con una imagen predefinida, tal y
como se muestra
Figura 6.17 Bloque de la librería para el procesamiento de imagen y video de Simulink para
realizar la convolución espacial entre dos matrices, normalmente una imagen y una ventana
donde se encuentra contenido la funcionalidad del filtro
Conexión Descripción
11 Matriz o una imagen a escala de grises, o bien un
plano de la imagen RGB.
12 Matriz, o venta de convolución, normalmente no
simétrica
Salida Una imagen o matriz resultado de la convolución
de 11 y 12.
Tabla 6.2 Funcionalidad de las entradas/salidas del bloque “2D – Convolution “
17
Las dimensiones de la matriz o imagen de salida se determinan mediante el
parámetro de configuración "Output Size". Suponiendo que las dimensiones de
la conexión 11 son (Ma, Na) y que las dimensiones de la conexión 12 son (Mb,
Nb). Si se elige el parámetro de configuración "Output Size" como Full, la salida
es la imagen producida por la convolución de 11 y 12, con dimensiones
(Ma+Mb-1, Na+Nb-1). En cambio, si se elige el parámetro de configuración
"Output Size" como same as input port 11, la salida es la parte central de la
convolución entre 11 y 12, omitiendo las partes laterales o bordes de la imagen
o matriz resultado de la convolución completa, por lo tanto, las dimensiones de
la matriz o imagen resultado son las mismas que las de 11. Por último, el
parámetro de configuración "Output Size" también puede tener el valor de valid,
con lo que la imagen o matriz de salida será el resultado de la convolución entre
11 y 12 sin considerar añadir ceros en los bordes de la matriz 11, de manera
que se pueda realizar la multiplicación de los coeficientes de 12.
18
4. Se suman los productos individuales del paso 3 para calcular el valor total de
(2,2). La figura 6.18 muestra un esquema de cómo se desarrolla el
procesamiento de la convolución para el elemento (2,2), considerando como
I1 y I2 las matrices anteriormente descritas.
[Link]. PROGRAMACIÓN DIRECTA DEL ALGORITMO PARA LA
LOCALIZACIÓN DE BORDES EN SIMULINK
Para realizar la programación directa del algoritmo de detección de bordes
utilizando el bloque "Edge Detection", es necesario solamente considerar la
aplicación directa de un operador de la tabla 6.1 sobre la imagen generada por
la operación de cada filtro (dependiendo de la dirección sobre la cual se
encuentre el gradiente), una matriz que represente al gradiente en esa
dirección (𝐺𝑥 , 𝐺𝑦 ).
Figura 6.19 Programa en Simulink para detectar los bordes en una imagen sin
utilizar el bloque "Edge Detection". Las matrices A y B, representan los filtros que se
aplican dependiendo del operador utilizado para encontrar el gradiente
19
Tal y como se muestra en la figura 6.19, las matrices A y B representan los
filtros del operador utilizado como una forma de aproximar el gradiente. En el
caso del ejemplo presentado aquí, se escogió el operador Sobel. Considerando
esto, las dimensiones y los coeficientes de las matrices que conforman sus
filtros están indicadas en la tabla 6.1. Es importante destacar que las matrices
A y B deben ser definidas desde la consola de MATLAB, para que desde allí
puedan ser tomadas por Simulink. Sin embargo, como se explicó
anteriormente, para el cálculo de los elementos de la convolución entre dos
matrices, utilizando el bloque "2-D Convolution", la matriz B, que normalmente
corresponde a la rejilla que determina el procesamiento espacial de la imagen,
es rotada 180º (como se ve en la ecuación 6.22) antes de realizar su
procesamiento. Por lo tanto, debemos tener en cuenta este efecto al momento
de definirla desde la línea de comandos en MATLAB, para que cuando sea
rotada, esta operación no afecte la definición de la matriz. Para el ejemplo aquí
mostrado, al utilizar el operador Sobel, se tiene:
Figura 6.20 Imagen Original y resultado, como consecuencia de haber ejecutado el programa
definido de la figura 6.18
20
[Link]. [Link] UTILIZACIÓN DE LOS BLOQUES DE PROCESAMIENTO DE
IMAGEN Y VÍDEO DE SIMULINK® PARA LA DETERMINACIÓN DE
BORDES EN FRAMES DE VÍDEO
Para utilizar la librería de bloques de procesamiento de imágenes y vídeo de
Simulink para procesar vídeo, se aplican todas las observaciones realizadas
para el caso del procesamiento de imagen, es decir la funcionalidad de los
bloques no cambia. Sin embargo, lo que si es necesario considerar es que el
procesamiento de vídeo es un proceso iterativo, en el cual un procesamiento o
algoritmo se ejecuta sobre el frame (una imagen de varias) de vídeo entrante,
continuando este proceso indefinidamente. A consecuencia de ello es
necesario configurar el ambiente de simulación, de tal forma que el algoritmo
se ejecute continuamente conforme existan frames de vídeo disponibles.
Dicha configuración es llevada a cabo con solo colocar el tiempo final o "Stop
time" de la opción Simulation>Configuration Parameters a inf, la figura 6.21
muestra la pantalla de los parámetros de configuración de la simulación y el
valor ya configurado.
Para poder procesar frames de video lo primero que hay que tener como
entrada es una fuente de video que permita obtener imágenes y a partir de ellas
procesarlas. Una opción interesante seria poder captar imágenes a partir de
una fuente de video de bajo costo como lo sería una Webcam.
Para poder captar imágenes a partir de una Webcam MatLAB provee un bloque
parte de las librerías contenidas en el Toolbox de Adquisición de Imágenes. El
bloque es accesible desde Simulink y permite capturar frames de una Webcam,
con el solo hecho de estar instalado su driver.
El bloque se encuentra representado en la figura 6.22, en ella pude apreciarse
como se trata de un bloque cuya funcionalidad es completamente destinada a
fungir como una fuente de imágenes provenientes en este caso de la Webcam.
21
Figura 6.22 Bloque "From Video Device" parte de la librería del Toolbox de Adquisición de
Imágenes. Permite capturar imágenes de un dispositivo de video compatible con Windows, tal
como una Webcam
Para poder utilizar este bloque es necesario configurarlo de tal forma que pueda
ser capaz de conectarse con el dispositivo de video (tal como la Webcam). Para
ello en su mascarilla de configuración es necesario seleccionar el concepto
"Device" la opción winvideo, la cual hará posible que el bloque pueda ser capaz
de comunicarse con el driver del dispositivo de video, en este caso con la
Webcam. La figura 6.23 muestra la ventana de configuración del bloque "From
Video Device" y el valor seleccionado para poder utilizar a la Webcam como
fuente de vídeo.
Figura 6.23 Muestra la ventana de configuración del bloque "From Video Device" y el valor
seleccionado para poder utilizar a la Webcam como fuente de video. Como puede verse en la
figura entre paréntesis se señala el nombre de la Webcam que en ese momento se encuentra
conectada y disponible para ser utilizada
Figura 6.24 Muestra el diagrama del algoritmo para la detección de bordes en Simulink
procesando frames de video. El diagrama es igual al utilizado para encontrar los bordes de la
imagen, con la diferencia de que en este se incorpora el bloque "From Video Device" para
adquirir imágenes de la Webcam y el umbral utilizado para la detección del borde es de 0.2
23
de la imagen. En una imagen, los cambios de intensidad pueden ser calculados
mediante el valor de la derivada en una determinada dirección (gradiente máximo) o
mediante el paso por cero de la segunda derivada (Laplaciano) en cualquier dirección.
Como puede verse el problema de utilizar la primera derivada como enfoque para la
detección de bordes resulta en la difícil localización de este al representar un método
altamente direccional o bien cuando el borde no esté bien definido.
Aunque el valor del gradiente permite detectar un borde, en ocasiones es importante
tener la información sobre si el píxel está en la transición positiva o negativa del
gradiente, que equivaldría a conocer si el píxel está del lado oscuro o de luz del borde.
6.5.1. Detección de bordes mediante la técnica de la segunda derivada
La técnica se basa en encontrar lo que se denomina pasos por cero (zero- crossing).
Un paso por cero no es más que la transición de positivo a negativo o viceversa y es
estimado a partir de la segunda derivada.
Si la definición de derivada para una función unidimensional puede ser considerada
como:
𝜕𝑓
= 𝑓(𝑥 + 1) − 𝑓(𝑥) 6.26
𝜕𝑥
Asimismo, partir de la ecuación 6.26 puede decirse que la segunda derivada se define
como:
𝜕𝑓 2
= 𝑓(𝑥 + 1) − 2𝑓(𝑥) + 𝑓(𝑥 − 1) 6.27
𝜕𝑥 2
Como fue mencionado la detección de bordes mediante la segunda derivada se basa
en el paso por cero del valor del gradiente en cualquier dirección, dicha característica
de hacer a este método insensible a la rotación es llamada isotrópica.
El operador Laplaciano es un filtro isotrópico definido por la siguiente expresión:
𝜕 2 𝐼(𝑥, 𝑦) 𝜕 2 𝐼(𝑥, 𝑦)
𝛻 2 𝐼(𝑥, 𝑦) = + 6.28
𝜕𝑥 2 𝜕𝑦 2
Este filtro al utilizar derivadas es lineal. Considerando la ecuación 6.27 en la expresión
6.28 del Laplaciano se tiene:
𝜕 2 𝐼(𝑥, 𝑦)
= 𝐼(𝑥 + 1, 𝑦) − 2𝐼(𝑥, 𝑦) + 𝐼(𝑥 − 1, 𝑦) 6.29
𝜕𝑥 2
Y
𝜕 2 𝐼(𝑥, 𝑦)
= 𝐼(𝑥, 𝑦 + 1) − 2𝐼(𝑥, 𝑦) + 𝐼(𝑥, 𝑦 − 1) 6.30
𝜕𝑦 2
Por lo que, si se juntan las expresiones 6.29 y 6.30 para formar 6.28, se tiene:
𝛻 2 𝐼(𝑥, 𝑦) = 𝐼(𝑥 + 1, 𝑦) + 𝐼(𝑥 − 1, 𝑦) + 𝐼(𝑥, 𝑦 + 1) + 𝐼(𝑥, 𝑦 − 1) − 4𝐼(𝑥, 𝑦) 6.31
24
Figura 6.26 Filtro que representa el cálculo del Laplaciano de forma espacial
sobre una imagen, obtenido a partir de la ecuación 6.27
Figura 6.27 Filtro del Laplaciano con la extensión de los vecinos diagonales al
píxel central
Un ejemplo de la aplicación del filtro Laplaciano sobre una imagen en escala de grises
es mostrado en la figura 6.28. En ella se muestran los diferentes efectos de aplicar la
doble derivada en cada una de las direcciones y por último el resultado de la suma de
las dos tal y como es definido el Laplaciano. La ecuación definida en 6.28 y expresada
en forma de filtro en la figura 6.26 no contempla las variaciones en los vecinos
diagonales al píxel en cuestión, los cuales pueden incorporarse al filtro, con la
consideración de que al hacer esto aumentaremos en 4 el número de unos contenidos
en el filtro por ello habrá que aumentar el coeficiente central a 8. Considerando lo
anterior el filtro Laplaciano quedaría definido tal como se describe en la figura 6.27.
Como puede observarse del cálculo de los filtros Laplacianos, tienen una respuesta
de cero en regiones en escala de grises uniformes y diferentes para regiones con
escalas de grises variantes. Esto es debido a que este tipo de filtros se comportan
como filtros pasa altas, la suma de los coeficientes es cero.
25
Figura 6.28 Utilización del filtro Laplaciano. (a) Figura original, (b) derivada
parcial de segundo orden horizontal 𝜕 2 𝐼(𝑥, 𝑦)/𝜕𝑥², (c) derivada parcial del
segundo orden vertical 𝜕 2 𝐼(𝑥, 𝑦)/𝑑𝑦² y (d) el operador Laplaciano 𝛻 2 𝐼(𝑥, 𝑦)
6.6. MEJORA DE NITIDEZ EN LAS IMÁGENES
Si se aplica el operador Laplaciano a una imagen obtendremos sus bordes. Sin
embargo, si lo que se desea es mejorar la nitidez de una imagen entonces lo que será
necesario hacer es conservar la información de baja frecuencia de la imagen original
y enfatizar los detalles presentes en la imagen a través del filtro Laplaciano. Para
realizar este efecto, es necesario restar a la imagen original una versión escalada del
valor del filtro Laplaciano. Por lo que la imagen con una nitidez mejorada quedaría
definida como se describe en la siguiente ecuación:
𝐼(𝑥, 𝑦)𝑀𝑒𝑗𝑜𝑟𝑎𝑑𝑎 = 𝐼(𝑥, 𝑦) − 𝑤 ∙ 𝛻 2 𝐼(𝑥, 𝑦) 6.32
La figura 6.29 muestra la idea por medio de la cual la imagen mejora en nitidez al
hacer más evidente la presencia de sus bordes. Para facilitar la explicación se
considera exclusivamente el caso unidimensional.
26
Figura 6.29 Aumento de la nitidez mediante la aplicación de la segunda derivada.
Al restar un factor de la segunda derivada a la función permite maximizar la
presencia de los contornos en la imagen
El efecto de mejorar la nitidez de una imagen se puede realizar en una sola pasada,
puesto que si se considera w=1, se tiene que
𝐼(𝑥, 𝑦)𝑀𝑒𝑗𝑜𝑟𝑎𝑑𝑎 = 𝐼(𝑥, 𝑦) − (1) ∙ 𝛻 2 𝐼(𝑥, 𝑦) 6.33
Y considerando que
𝛻 2 𝐼(𝑥, 𝑦) = 𝐼(𝑥 + 1, 𝑦) + 𝐼(𝑥 − 1, 𝑦) + 𝐼(𝑥, 𝑦 + 1) + 𝐼(𝑥, 𝑦 − 1) − 4𝐼(𝑥, 𝑦) 6.34
Figura 6.30 Aplicación del filtro Laplaciano para la mejora de nitidez de una
imagen. (a) Imagen original y (b) la imagen resultado de aplicar
𝐼(𝑥, 𝑦)𝑀𝑒𝑗𝑜𝑟𝑎𝑑𝑎 = 𝐼(𝑥, 𝑦) − 𝑤 ∙ 𝛻 2 𝐼(𝑥, 𝑦), considerando w=1
Se tendría que
𝐼(𝑥, 𝑦)𝑀𝑒𝑗𝑜𝑟𝑎𝑑𝑎 = 5𝐼(𝑥, 𝑦) − [𝐼(𝑥 + 1, 𝑦) + 𝐼(𝑥 − 1, 𝑦) + 𝐼(𝑥, 𝑦 + 1) + 𝐼(𝑥, 𝑦 − 1)] 6.35
El código MatLAB para mejorar la nitidez de una imagen puede ser dividido en dos
sencillos pasos, en el primero se calcula el filtro Laplaciano a partir del filtro descrito
en la figura 6.27, en el segundo se mejora la nitidez de la imagen considerando la
información de baja frecuencia contenida en la imagen original menos el valor del
Laplaciano (véase ecuación 6.32) el cual incorpora la información que permite realzar
los detalles de la imagen.
27
El programa 6.2 muestra la codificación en MatLAB para la mejora de la nitidez de
una imagen mediante el uso del Laplaciano.
28
Figura 6.31 Programa que mejora la nitidez aplicando el operador Laplaciano de
las imágenes capturadas a través de la Webcam
Como puede notarse en este programa vuelve a hacerse uso del bloque "2- D
Convolution" el cual realiza el cálculo del Laplaciano de la imagen que es capturada
instantáneamente de la Webcam.
>> 𝐴 = [1 1 1; 1 − 8 1; 1 1 1];
El valor calculado del Laplaciano es multiplicado por un factor (0.5) que define la forma
en cómo este operador modificará a la imagen a la cual se desea mejorar su nitidez.
Después este valor es restado a la imagen original produciendo así a la imagen
mejorada. Un problema importante es que este operador como fue mencionado en la
sección 6.5 funciona como un filtro pasa altas, por lo que el ruido presente en la
imagen original es maximizado también, es por eso por lo que si se ejecuta este
programa se verá claramente como la nitidez de la imagen resultado mejora, sin
embargo, de la misma manera aparecerán algunos artefactos producto del ruido
propio del frames que se procesan. La figura 6.32 muestra el resultado de ejecutar el
programa en Simulink definido en la figura 6.31
29
Figura 6.32 Resultado de haber ejecutado el programa en Simulink mostrado en la
figura 6.31
6.7. EL FILTRO CANNY
Un conocido método para la detección de bordes en imágenes es el filtro de Canny.
Este método se basa en la aplicación de una serie de filtros en direcciones y
resoluciones diferentes, los cuales al final son combinados en un resultado único. El
método intenta alcanzar 3 diferentes objetivos, (a) minimizar el número de bordes
falsos, (b) una mejor localización de los bordes en la imagen y (c) entregar una imagen
cuyo ancho de borde es un píxel. El filtro de Canny es en esencia un filtro basado en
métodos de gradiente, pero, sin embargo, usa también para la localización de bordes
como criterio la segunda derivada o Laplaciano. La mayoría de las veces este
algoritmo es utilizado en su forma sencilla, es decir configurando solamente el
parámetro de suavizado 𝜎. La figura 6.33 muestra ejemplos de la aplicación de este
algoritmo utilizando para ello diferentes valores del parámetro 𝜎.
30
Figura 6.33 Algoritmo de Canny aplicado a una imagen (a) Imagen original, (b)
bordes de la imagen con 𝜎 = 0,1, (c) bordes de la imagen con 𝜎 = 1 y (d) bordes de
la imagen 𝜎 = 2
6.7.1. Herramientas de MatLAB que implementan el filtro de Canny.
Debido a la amplia utilización de este filtro como etapa previa en la segmentación y
clasificación de objetos y a su robustez en la determinación de bordes, el filtro es
normalmente implementado en la mayoría de las librerías comerciales y herramientas
de procesamiento digital de imágenes. En MatLAB el algoritmo de Canny puede ser
calculado mediante la función Edge, su formato general es
donde Bw es la imagen con los bordes extraídos a partir del algoritmo de Canny, I es
la imagen en escala de grises a la cual se le extraerán los bordes. U es el valor del
umbral a partir del cual los pixeles que tengan un gradiente mayor a éste serán
considerados candidatos para ser bordes y sigma, el cual es el parámetro (6) de
suavizado que tiene el efecto de minimizar el número de bordes falsos. También es
posible utilizar el algoritmo de Canny en las librerías de procesamiento de imagen y
video de Simulink, para ello sólo bastaría con configurar el bloque "Edge Detection",
indicándole (1) que se utilizara el método de Canny, (2) si se usara un umbral definido
por el usuario o no. (3) el porcentaje de los bordes que considerados falsos serán
eliminados y (4) el parámetro σ. La figura 6-34 muestra el bloque "Edge Detection" y
su mascarilla de configuración.
31