📜  Matlab |不使用内置函数对图像进行边缘检测

📅  最后修改于: 2021-04-16 08:42:24             🧑  作者: Mango

问题陈述:不使用内置的边缘检测函数,编写用于灰度图像边缘检测的matlab代码。

关于边缘检测:

边缘检测是一种图像处理技术,用于查找图像内对象的边界。它通过检测亮度不连续来工作。边缘检测用于图像处理,计算机视觉和机器视觉等领域中的图像分割和数据提取。

方法:
对于边缘检测,我们借助卷积:Convolution = I * m其中I是图像,m是遮罩,*是卷积运算符。要对图像执行卷积,需要执行以下步骤:

  1. 水平翻转面具,然后垂直翻转。这将导致图像旋转180度。
  2. 将蒙版滑动到图像上,以使图像中的每个像素至少与蒙版的中心重合一次。
  3. 将对应的元素与下面的像素值相乘,然后将它们相加。
  4. 重复此过程,直到已计算出图像的所有像素值以进行更新。

我们将分别找到这些边缘,最后使用max 函数或mean 函数组合它们,但是max 函数对此更准确。

原始图片:

垂直边缘的Matlab代码:
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));

输出:

水平边缘的Matlab代码:

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));

输出:

主要对角线边缘的Matlab代码:

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));

输出:

辅助对角线边缘的Matlab代码:

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));

输出:

用于边缘检测的最终Matlab代码:

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));

输出: