Está en la página 1de 52

Bordes

• El objetivo consiste en , dada una imagen, que puede estar o no


corrompida por ruido, localizer los bordes más probables generados
por elementos de la escena no por ruido.

• Los bordes de una imagen digital se pueden definir como transiciones


entre dos regiones de niveles de gris significativamente distintos.
Bordes
Bordes
Al intentar detectar bordes, se generan errores que se intentarán
minimizar :

• Errores de detección: no se encuentran bordes reales y se consideran


como tales otros que no lo son.

• Errores de localización: Los bordes se desplazan de la posición real.

• Errores de amplificación: pixels que se consideran bordes por estar


situados al lado de otros que sí lo son.
Bordes

DIVERSAS TECNICAS Y EJEMPLOS DE


DETECCION DE BORDES.
Vector
Vector Gradiente
Gradiente
• Utilizamos la imagen simpson.jpg para el ejemplo:
>> I=imread(‘simpson.jpg’);
>> I1=rgb2gray(I); % a escala de grises en 2D
>> Hx=imfilter(I1, [-1,1],’conv’)
………..

Aquí detectamos cambios de intensidad


horizontal. El vector gradiente [-1 1]
representa un cambio abrupto entre un nivel
y otro adyacente horizontalmente
Vector Gradiente

• Operador de Gradiente:
Primera y segunda
derivada.
Vector gradiente
Para detectar cambios de intensidad verticales debemos usar el vector
columna [-1 ; 1]:

>> I=imread(‘simpson.jpg’);
>> I1=rgb2gray(I);
>> Hy=imfilter(I1, [-1;1], ‘conv’) %Ojo acá! [-1;1] es vector columna
…….

Aquí detectamos cambios de intensidad vertical. El vector


gradiente [-1 ; 1] representa un cambio abrupto entre un nivel
y otro adyacente verticalmente
Vector gradiente
Unir horizontal y vertical
• Se pueden unir ambos resultados para detectar cambios de
intensidad horizontal y vertical a la vez, o sea:

Hay que tener mucho cuidado de realizar estas operaciones


con números de precisión double. Esto sería de la siguiente
manera:

>> Hx1=double(Hx)/255;
>> Hy1=double(Hy)/255;
>> Hxy=sqrt(Hx1.^2 + Hy1.^2);
>> imshow(Hxy)
Horizontal,vertical, juntos
Con los colores invertidos para apreciar mejor el borde:

>> Hx1=1-Hx1;
>> Hy1=1-Hy1;
>> Hxy=1-Hxy;
Gradiente: Operador de Roberts
Gradiente: Operador de Roberts…
Ejemplo usando la misma imagen de H. Simpson:
>> R=[0 0 0; 0 0 1; 0 -1 0];
>> H=imfilter(I1,R, ‘conv’);
>> imshow(H)
Gradiente: Operador de Roberts

• Obtiene buena respuesta ante bordes diagonales. Ofrece buenas


prestaciones en cuanto a localización. El gran inconveniente de este
operador es su extremada sensibilidad al ruido y por tanto tiene
pobres cualidades de detección.
Gradiente: Operador de Roberts
…Gradiente: Operador de Roberts
Se pueden utilizar las dos diagonales a la vez:

>> R1=[0 0 0; 0 0 1; 0 -1 0];


>> R2=[-1 0 0; 0 1 0; 0 0 0];
>> H1=imfilter(I1,R1,’conv’);
>> H2=imfilter(I1,R2,’conv’);
>> Hx=double(H1)/255;
>> Hy=double(H2)/255;
>> Hxy=sqrt(Hx.^2 + Hx.^2);
>> imshow(Hxy)
Gradiente: Operadores de Prewitt, Sobel y Frei-
ChenPrewitt

• Prewitt (K=1): se involucran a los vecinos de filas / columnas


adyacentes para proporcionar mayor inmunidad al ruido.

• Sobel (K=2): se supone que es más sensible a los bordes diagonales


que el de Prewitt aunque en la práctica hay poca diferencia entre
ellos.

• Frei-Chen (K= sqrt(2) ): el gradiente es el mismo para bordes


verticales, horizontales y diagonales.
Ejemplo
Ejemplo Máscara para Sobel:
>> R1=[1 0 -1; 2 0 -2; 1 0 -1];
>> R2=[-1 -2 -1; 0 1 0; 1 2 1];
Prewit: Máscara para Frei-Chen:
>> R1=[1 0 -1; 1 0 -1; 1 0 -1]; >> R1=[1 0 -1; sqrt(2) 0 - sqrt(2); 1 0 -1];
>> R2=[-1 - sqrt(2) -1; 0 1 0; 1 sqrt(2) 1];
>> R2=[-1 -1 -1; 0 1 0; 1 1 1];
>> H1=imfilter(I1,R1,’conv’);
>> H2=imfilter(I1,R2,’conv’);
>> Hx=double(H1)/255;
>> Hy=double(H2)/255;
>> Hxy=sqrt(Hx.^2 + Hx.^2);
>> imshow(Hxy)
Cual es el resultado para Sobel y Frei-Chen?
Operadores de Segunda derivada: Laplaciano

% Imagen original
>> I=imread('moon.tif'); %Ya viene en dos dimensiones
% Máscara laplaciana
>> w=[0, 1, 0; 1, -4, 1; 0, 1, 0];
% Se aplica el filtro
>> I2=imfilter(I,w, ‘conv’);

Estas máscaras pueden generarse manualmente o a través de la función fspecial:


>> fspecial('laplacian',n) %con n entre 0 y 1
>> fspecial('laplacian',0)
ans =0 1 01 -4 10 1 0
Operadores de Segunda derivada: Laplaciano
• Existen distintas máscaras Laplacianas que representan diferentes
aproximaciones del operador Laplaciado. A diferencia de las mascaras utillizadas
por los operadores de primera aderivada, estas son simetricas rotacionalmente,
lo que significa que pueden detector bordes en todas las direcciones del espacio.
Se aplican selesccionando primero la mascara y realizando una operacion de
convolucion sobre la imagen.
Operadores de Segunda derivada: Laplaciano
Laplaciano: Ejemplo
• Utilizamos la imagen gris de Simpson guardada en I1:
>> L=fspecial('laplacian',0)
>> g=imfilter(I1,L,‟conv‟);
>> imshow(g)

Comparación con Sobel:


Operador LoG: Laplaciano del Gaussiano

La máscara se puede hacer con fspecial:

w=fspecial('log',H,S) % donde H es el tamaño de la máscara % S es la desviación estándar

Por defecto H es 5, lo que genera una máscara de 5x5 y la desviación estándar es


de 0.5 Veamos con Simpson:

>> LoG=fspecial(‘log');
>> g=imfilter(I1,LoG,‟conv‟);
>> imshow(g)
Comparaciones
Comparando
Sobel Laplaciano LoG
Operador LoG: Laplaciano del Gaussiano
Con diferentes desviaciones estándar:

0.5 0.3 0.8


z=fspecial('log'); z=fspecial('log',5,0.3); z=fspecial('log',5,0.8);
Otros comandos Matlab: edge
En Matlab se puede utilizar la función imfilter, pero también existe otra función para
detectar bordes : edge.

BW = edge ( I, método, umbral, dirección)

Donde:
 I:Imagen en escala de grises

método:es el tipo de filtro a usar, entre otros: ‘sobel’, ‘prewitt’,‘ roberts’, ‘log’,
‘canny’, etc.

umbral:Opcionalmente se puede indicar un umbral para realizer la binarización

dirección:Opcionalmente se puede indicar ,en Sobel y Prewitt ,la dirección que


puede ser ‘vertical’, ‘horizontal’ ó ‘both’. Por defecto es both
Sobel
Ejemplo: Sobel

im1=imread('moon.tif');
im1=rgb2gray(im1);
b1=edge(im1,'sobel','vertical');
b2=edge(im1,'sobel','horizontal');
b3=edge(im1,'sobel');
%% utilizar solo subplot e imshow para mostrar
subplot(2,2,1)
subimage(im1)
title('Imagen Original');
subplot(2,2,2), subimage(b1),title('Sobel Vertical');
subplot(2,2,3),subimage(b2),title('Sobel Horizontal');
subplot(2,2,4),subimage(b3),title('Sobel');
Edge con Log
Ejemplo: Log
im1=imread(moon.tif');
e=edge(im1, 'log');
subplot(1,2,1), subimage(im1), Title('Imagen Original');
subplot(1,2,2),subimage(e),Title('Laplaciano de Gaussiano');
Ejercicio 8

• Encontrar los bordes de 3 imágenes utilizando 3 técnicas


que vimos a inicio del tema de bordes ( modifica
desviaciones y técnicas Log,etc) Script 1

• Encontrar bordes de la Imagen, aplicando todos los filtros


posibles que admite la función edge, ponerlos todos en
comparación en un subplot. ( revisa bien cuales admite
edge utiliza mínimo 4) script 2

Adjunta todo en una carpeta .zip y súbelo


en el apartado ejercicio 8
Diferencia imfilter, edge

imfilter edge
Ejemplo con imfilter

También se podría aplicar el filtro de Sobel, por ejemplo, creando una


máscara con la función fspecial y luego usando el comando imfilter.

De esta forma se obtiene una imagen de bordes en escala de grises.


Para obtener tanto los bordes horizontales cómo los verticales se utiliza
la función imadd.
………
Ejemplo con imfilter

>>im1=imread(‘moon.tif');
>>sf=fspecial('sobel');
>>sc=sf';
>>b1=imfilter(im1,sf);
>>b2=imfilter(im1,sc);
>>b3=imadd(b1,b2);
>>subplot(2,2,1),subimage(im1),Title('Imagen Original');
>>subplot(2,2,2),subimage(b2),Title('SobelVertical');
>>subplot(2,2,3),subimage(b1),Title('SobelHorizontal');
>>subplot(2,2,4),subimage(b3),Title('Sobel');
Segmentación
Segmentación
• La segmentación de imágenes divide la imagen en sus partes
constituyentes hasta un nivel de subdivisión en el que se aíslen las
regiones u objetos de interés.
Se divide la imagen basándose en la búsqueda de zonas que tengan valores
similares, conforme a unos criterios prefijados:

Crecimiento de región: Parten del centro de un objeto hacia el exterior tratando de


encontrar los bordes que lo limitan

Umbralización: Los umbrales actúan como separadores que permitirán decidir que
conjunto de tonos de gris pertenece a una determinada región.
Segmentación: Umbral y multiumbral

• Como elegimos t?
Una respuesta es: Trabajamos con el histograma.

Si observamos el histograma de esta imagen, los lugares donde


hay picos y valles, son perfectos para establecer un umbral. El
umbral se establece como el valor que se encuentra entre dos
picos: T=90;
Segmentación: Umbral y multiumbral

El eje horizontal representa los diferentes tonos de gris desde el


negro puro (a la izquierda) al blanco puro (a la derecha).

El eje vertical representa el número de pixels que contiene la


imagen para cada tono representado en el eje horizontal.
Segmentación: Umbral y multiumbral

>>A=imread('geological01.jpg');
>> A1=A(:,:,1); %Siempre se trabaja en escala de grises
>> imhist(A1)
>> G=A1; %Para no modificar la original
>> G(A1<90)=0;
>> G(A1>=90)=255;
>> imshow(G)
Segmentación: Umbral y multiumbral Comando
graythresh

Para tomar un umbral óptimo y binarizar adecuadamente una imagen,


tenemos algunas funciones en Matlab:

>> umbral = graythresh(A) %A es una imagen


umbral =
0.4549

Este comando retorna el resultado en double aunque la imagen A sea


de tipo uint8.
Segmentación: Umbral y multiumbral Comando
Ejemplo graythresh
Tomemos la misma imagen anterior y la binarizamos con el umbral
obtenido con graythresh:

>>A=imread('geological01.jpg');
>> A1=A(:,:,1); %Siempre se trabaja en escalade grises
>> G= im2double(A1); % Ojo porque graythresh trabaja en double!!
>> umbral = graythresh(G);
>> G(G<=umbral)=0; %retorna 0.4353
>> G(G>umbral)=1;
>> imshow(G)

………………………..
Segmentación: Umbral y multiumbral Comando
graythresh

• Tomemos la imagen de la luna y la binarizamos con el umbral


obtenido con graythresh:

>>A=imread('moon.tif'); %Ya está en dos capas


>> I=im2double(A);%para facilitar el manejo del umbral
>> u=graythresh(I);
>> I2=I;
>> I2(I<u)=0;
>> I2(I>=u)=1;
>> imshow(I2)

……………………
Podemos usar mecanismos manuales,por ejemplo el comando impixel:

>>A=imread('geological01.jpg');
>> A1=A(:,:,1); %Siempre se trabaja en escalade grises
>>imshow(A1)
>>impixel

ans=
156 156 156 % Tomamos este valor como umbral

>> G=A1;
>> G(A1<=156)=0;
>> G(A1>156)=1;
>> imshow(G)
Segmentación: Umbral y multiumbral Comando
graythresh
Graythresh también se puede utilizar con un comando que permite
binarizar directamente la imagen según el umbral dado:

>>BW=im2bw(A1,umbral); %dados una imagen A1 en escala de grises y un


umbral u, retorna una imagen en blanco y negro
>>imshow(BW)
Reconocimiento de objetos
• A veces se suele usar binarización, por ejemplo para reconocer
objetos. Supongamos la imagen monedas.jpg:

>> A=imread('monedas.jpg');>> A1=rgb2gray(A); % otra forma de tomar la imagen en escala de grises


>> imshow(A1)
>>umbral = graythresh(A1) ;%Retorna el mejor umbral
>>BW=im2bw(A1,umbral); % Binarizamos y obtenemos una matriz de 1 y 0 (fondo blanco)
>>BW=1-BW; % Obtenemos la figura de fondo negro y monedas blancas
>>imshow(BW)

…………………
Imfill “limpia imágenes”
• Puede ser interesante limpiar el interior de las monedas. Esto lo
podemos hacer con el siguiente comando:

>> fill=imfill(BW,'holes'); % Limpiamos los “agujeros, dada la imagen BW, usando


el parámetro „holes‟”
>> imshow(fill)

…………
Podemos usar un comando para contar la cantidad de monedas. El siguiente comando
otorga etiquetas a cada objeto identificado:

>> [B,n] = bwlabel(fill,8); %fill es la imagen obtenida con el comando imfill y el nro 8
representa la cantidad de vecinos para determinar objetos conectados. Puede ser 4 ú 8

El resultado es una matriz con 0 en el fondo y luego cada


objeto se identifica con un número a partir de 1 hasta n
que es la cantidad de objetos encontrados.
……..
Para ser claros, si se tiene la siguiente matriz:
Al etiquetar, realizamos:
BW = ([1 1 1 0 0 0 0 0 >> L = bwlabel(BW,4)
11101100 L=11100000
11101100 11102200
11100010 11102200
11100010 11100030
11100010 11100030
11100110 11100030
1 1 1 0 0 0 0 0]); 11100330
11100000

Probar que sucede en L al cambiar el 4 por 8


Dilatación

• Permite añadir puntos a un objeto en los pixeles


que tocan el borde en una imagen binaria o
escala de grises, aumentando la definición de la
imagen.

• Por que querríamos dilatar una imagen???


Porque, por ejemplo, al extraer bordes, no
están completos, como pasaba en algunos de
los ejemplos anteriores:
Dilatación

• En Matlab, el comando para realizar esta acción se llama imdilate y se


precisa un elemento estructurante.

• Un elemento estructurante es un subconjunto de puntos, cuya


representación en el plano tiene cierta forma y tamaño (puede ser
cualquier figura geométrica).
La dilatación posee dos pasos:

1) Hallar un elemento estructurante con el comando strel


2) Utilizar el comando imdilate para dilatar

NOTA : Si se utiliza un elemento estructurante muy grande,


se corre el riesgo de deformar demasiado la imagen
original!!!
Elemento estructurante
En Matlab el elemento estructurante se genera con el comando
strel: SE = strel(shape, parameters)
donde:
shape es la forma que puede ser: 'ball, line, diamond, octagon, square'
parameters define la figura geometrica.

Por ejemplo, para ball debemos dar un radio, para square una medida de lado, etc.
Ejemplos:

1. SE = strel('ball', 3, 2) % donde 3 es el radio y 2 la altura


2. SE = strel('diamond', 4) % donde 4 es la diagonal del diamante
3. SE = strel('rectangle', [3 5]) % donde [3 5] es la medida de la base y la altura
4. SE = strel('square', 4) % donde 4 es la medida del lado
Ejemplo

Usa la imagen de la luna, que se obtiene luego de aplicar el filtro de Laplaciano


de Gaussiano:

I=imread('moon.tif');
z=fspecial('log',5,0.3);
g=imfilter(I,z,'conv');
se = strel('line',8,45);
D = imdilate(g,se);
imshow(D)
Erosion

De la misma manera, si los bordes resultan demasiado gruesos, hay un comando para
“erosionarlos”:
Ejemplo:
Result=imerode(Imagen,SE) originalBW = imread('circles.png');
se = strel('disk',11);
dónde erodedBW = imerode(originalBW,se);
imshow(originalBW),
SE es el elemento estructurante figure,
Imagen es previamente binarizada. imshow(erodedBW)
• Estando a 269km por encima de la superficie, cada pixel de la imagen
representa 2.35 km2 . Se quiere conocer la superficie del cráter y
diámetro vertical (máximo). Para esto se tiene que hacer lo siguiente:

a) Detectar su contorno: Seguramente al mismo tiempo se detectarán


otras irregularidades menores de la superficie.
b) Utilizar un método que permita filtrar parte de esos detalles y de ser
necesario terminar de eliminarlos.
c) Calcular los datos pedidos.
Imagen

También podría gustarte