Declaración del problema: escriba un código matlab para la detección de bordes de una imagen en escala de grises sin usar la función incorporada de detección de bordes.
Acerca de la detección de bordes:
La detección de bordes es una técnica de procesamiento de imágenes para encontrar los límites de los objetos dentro de las imágenes. Funciona detectando discontinuidades en el brillo. La detección de bordes se utiliza para la segmentación de imágenes y la extracción de datos en áreas como el procesamiento de imágenes, la visión artificial y la visión artificial.
Enfoque:
Para la detección de bordes, tomamos la ayuda de la convolución: Convolución = I * m donde I es la imagen, m es la máscara y * es el operador convolucional. Para realizar la convolución en una imagen, se requieren los siguientes pasos:
- Voltea la máscara horizontalmente y luego verticalmente. Esto dará como resultado una rotación de 180 grados de una imagen.
- Deslice la máscara sobre la imagen de modo que cada píxel de la imagen coincida con el centro de la máscara al menos una vez.
- Multiplique los elementos correspondientes con los valores de píxel debajo y luego agréguelos.
- Repita este procedimiento hasta que se hayan calculado todos los valores de píxeles de la imagen para la actualización.
Ahora, tomaremos una máscara 3×3 para lo mismo.
Máscara 3×3 para bordes verticales: [1, 0, -1; 1, 0, -1; 1, 0, -1]
Máscara 3×3 para bordes horizontales: [1, 0, -1; 1, 0, -1; 1, 0, -1]
Máscara 3×3 para aristas diagonales principales: [1, 0, -1; 1, 0, -1; 1, 0, -1]
Máscara 3×3 para bordes diagonales secundarios: [1, 0, -1; 1, 0, -1; 1, 0, -1]
Encontraremos estos bordes por separado y finalmente los combinaremos usando max
función o función media, pero max
la función es más precisa para esto.
Imagen original:
Código Matlab para bordes verticales:
I=double((imread('image1.jpg')); %read image In=I; %copy image mask=[1, 0, -1;1, 0, -1;1, 0, -1]; %Rotate image by 180 degree first flip up to down then left to right mask=flipud(mask); mask=fliplr(mask); for i=2:size(I, 1)-1 for j=2:size(I, 2)-1 %multiplying mask value with the corresponding image pixel value neighbour_matrix=mask.*In(i-1:i+1, j-1:j+1); avg_value=sum(neighbour_matrix(:)); I(i, j)=avg_value; end end figure, imshow(uint8(I));
Producción:
Código de Matlab para bordes horizontales:
I=double((imread('image1.jpg')); In=I; mask=[1, 1, 1;0, 0, 0;-1, -1, -1]; mask=flipud(mask); mask=fliplr(mask); for i=2:size(I, 1)-1 for j=2:size(I, 2)-1 neighbour_matrix=mask.*In(i-1:i+1, j-1:j+1); avg_value=sum(neighbour_matrix(:)); I(i, j)=avg_value; end end figure, imshow(uint8(I));
Producción:
Código de Matlab para las aristas diagonales principales:
I=double((imread('image1.jpg')); In=I; mask=[0, -1, -1;1, 0, -1;1, 1, 0]; mask=flipud(mask); mask=fliplr(mask); for i=2:size(I, 1)-1 for j=2:size(I, 2)-1 neighbour_matrix=mask.*In(i-1:i+1, j-1:j+1); avg_value=sum(neighbour_matrix(:)); I(i, j)=avg_value; end end figure, imshow(uint8(I));
Producción:
Código Matlab para bordes diagonales secundarios:
I=double((imread('image1.jpg')); In=I; mask=[1, 1, 1;0, 0, 0;-1, -1, -1]; mask=flipud(mask); mask=fliplr(mask); for i=2:size(I, 1)-1 for j=2:size(I, 2)-1 neighbour_matrix=mask.*In(i-1:i+1, j-1:j+1); avg_value=sum(neighbour_matrix(:)); I(i, j)=avg_value; end end figure, imshow(uint8(I));
Producción:
Código Matlab final para la detección de bordes:
I=double(imread('image1.jpg')); In=I; mask1=[1, 0, -1;1, 0, -1;1, 0, -1]; mask2=[1, 1, 1;0, 0, 0;-1, -1, -1]; mask3=[0, -1, -1;1, 0, -1;1, 1, 0]; mask4=[1, 1, 0;1, 0, -1;0, -1, -1]; mask1=flipud(mask1); mask1=fliplr(mask1); mask2=flipud(mask2); mask2=fliplr(mask2); mask3=flipud(mask3); mask3=fliplr(mask3); mask4=flipud(mask4); mask4=fliplr(mask4); for i=2:size(I, 1)-1 for j=2:size(I, 2)-1 neighbour_matrix1=mask1.*In(i-1:i+1, j-1:j+1); avg_value1=sum(neighbour_matrix1(:)); neighbour_matrix2=mask2.*In(i-1:i+1, j-1:j+1); avg_value2=sum(neighbour_matrix2(:)); neighbour_matrix3=mask3.*In(i-1:i+1, j-1:j+1); avg_value3=sum(neighbour_matrix3(:)); neighbour_matrix4=mask4.*In(i-1:i+1, j-1:j+1); avg_value4=sum(neighbour_matrix4(:)); %using max function for detection of final edges I(i, j)=max([avg_value1, avg_value2, avg_value3, avg_value4]); end end figure, imshow(uint8(I));
Producción:
Publicación traducida automáticamente
Artículo escrito por AashutoshChauhan y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA