Utilice el operador de Sobel para la detección de bordes de imágenes en MATLAB
Veremos diferentes formas de utilizar el método Sobel
de procesamiento de imágenes de detección de bordes en MATLAB. Usaremos diferentes códigos de ejemplo y resultados relacionados para aclarar sus conceptos y brindarle una visión completa del método Sobel
de la técnica de procesamiento de imágenes de detección de bordes en MATLAB.
Tenga en cuenta que la detección de bordes abarca una variedad de enfoques analíticos para encontrar límites y contornos en una imagen computarizada donde la intensidad de la imagen varía abruptamente o, más precisamente, contiene discontinuidades.
La detección de pasos identifica la discontinuidad en las señales unidimensionales, mientras que la detección de cambios identifica las irregularidades de la señal.
La detección de bordes es una técnica poderosa en el análisis visual, la visión artificial y el reconocimiento de objetos, especialmente en el reconocimiento y la separación de objetos. Los enfoques de Sobel, Canny, Prewitt, Roberts y Fuzzy logic son técnicas de detección de bordes prominentes.
Utilice el operador Sobel
desde cero para la detección de bordes de imágenes en MATLAB
El operador Sobel
, también conocido como operador Sobel–Feldman
o filtro Sobel
, se puede emplear en el procesamiento de imágenes y vídeos, sobre todo en las técnicas de detección de bordes. Genera una imagen que enfatiza los bordes.
Fue nombrado en honor a los colaboradores del Laboratorio de Inteligencia Artificial de Stanford, Irwin Sobel y Gary Feldman (SAIL). En 1968, Sobel & Feldman introdujo el concepto de un operador de gradiente de imagen isotrópico 3x3 en SAIL.
Un operador de diferenciación discreta calcula un gradiente aproximado de la curva de intensidad de la imagen. La operación Sobel–Feldman
produce el vector de gradiente coincidente o la normal de este vector en cada ubicación de la imagen.
El operador Sobel–Feldman
se basa en la convolución de la imagen en las direcciones horizontal y vertical con un filtro pequeño, separable y de valor entero y, por lo tanto, es computacionalmente barato. Sin embargo, la aproximación de gradiente generada es extremadamente pobre, especialmente para fluctuaciones de alta frecuencia en la imagen.
Entendamos este concepto mirando el siguiente ejemplo.
Código de ejemplo:
Aimage=imread('peppers.png');
imshow(Aimage)
Bimage=rgb2gray(Aimage);
Cimage=double(Bimage);
for k=1:size(Cimage,1)-2
for l=1:size(Cimage,2)-2
%Sobel mask for x-direction:
G_x=((2*Cimage(k+2,l+1)+Cimage(k+2,l)+Cimage(k+2,l+2))-(2*Cimage(k,l+1)+Cimage(k,l)+Cimage(k,l+2)));
%Sobel mask for y-direction:
G_y=((2*Cimage(k+1,l+2)+Cimage(k,l+2)+Cimage(k+2,l+2))-(2*Cimage(k+1,l)+Cimage(k,l)+Cimage(k+2,l)));
%The gradient of the image
%B(i,j)=abs(Gx)+abs(Gy);
Bimage(k,l)=sqrt(G_x.^2+G_y.^2);
end
end
figure,
imshow(Bimage);
title('Sobel gradient Image');
Producción:
La imagen de borde detectado se puede obtener del gradiente Sobel
utilizando una configuración de corte/umbral. En cambio, el nivel de umbral se aplica si las proporciones del gradiente Sobel
son menores que el nivel de criterio.
Si f
es igual al umbral crítico, f
es igual al corte predefinido.
Código de ejemplo:
Aimage=imread('peppers.png');
imshow(Aimage)
Bimage=rgb2gray(Aimage);
Cimage=double(Bimage);
for k=1:size(Cimage,1)-2
for l=1:size(Cimage,2)-2
%Sobel mask for x-direction:
G_x=((2*Cimage(k+2,l+1)+Cimage(k+2,l)+Cimage(k+2,l+2))-(2*Cimage(k,l+1)+Cimage(k,l)+Cimage(k,l+2)));
%Sobel mask for y-direction:
G_y=((2*Cimage(k+1,l+2)+Cimage(k,l+2)+Cimage(k+2,l+2))-(2*Cimage(k+1,l)+Cimage(k,l)+Cimage(k+2,l)));
%The gradient of the image
%B(i,j)=abs(Gx)+abs(Gy);
Bimage(k,l)=sqrt(G_x.^2+G_y.^2);
end
end
figure,
imshow(Bimage);
title('Sobel gradient Image');
%Define a threshold value
Thresholdd=100;
Bimage=max(Bimage,Thresholdd);
Bimage(Bimage==round(Thresholdd))=0;
Bimage=uint8(Bimage);
figure,
imshow(Bimage);
title('Edge detected Image');
Aquí surge la pregunta de por qué restamos 2 en i=1:tamaño (C,1) -2
y j=1:tamaño (C,2) -2
. Esto se debe a que se produce un cuadro de 3x3 desde cada ubicación (i,j)ésima
.
Al eliminar 2, podemos mantener el número dentro de sus límites. Ese límite resulta de la convolución de la máscara horizontal Sobel
3x3 con la matriz de la imagen, suponiendo que estamos viendo el elemento C(i,j)
de la matriz de la imagen de origen.
Para obtener el componente correspondiente en la matriz Gx
, Gx(i,j)
, elegimos los 8 vecinos alrededor de los elementos C(i,j)
y C(i,j)
, multiplicamos cada uno de ellos por el elemento correspondiente de la máscara Sobel
, y se suman los resultados: C(i-1,j-1) * S(1,1)+C(i-1,j) * S(1,2) * C(i-1,j+1) * S(1,3)+..
(9 multiplicaciones aquí).
Producción:
Mehak is an electrical engineer, a technical content writer, a team collaborator and a digital marketing enthusiast. She loves sketching and playing table tennis. Nature is what attracts her the most.
LinkedIn