Matlab | Detección de bordes de una imagen sin usar la función incorporada

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:

  1. Voltea la máscara horizontalmente y luego verticalmente. Esto dará como resultado una rotación de 180 grados de una imagen.
  2. 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.
  3. Multiplique los elementos correspondientes con los valores de píxel debajo y luego agréguelos.
  4. 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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *