数字图像处理-Matlab实现图像边缘检测

1.边缘检测函数

1.1Sobel算子边缘检测

function OutImage = SobelOperate(InputImage,Direction)
%================================================================
% 功能:Sobel边缘检测
% 参数:InputImage为输入单通道图像,Dirction为模板方向,
% Direction=1水平,Direction=1垂直,Direction=1综合
% 返回值:OutImage为InputImage同维数组
% 主要思路:利用Sobel算子,计算相关
% 备注:如果图像为多通道则需要重复调用
% 调用方法:OutImage = FilterGauss(InputImage)
% 日期:2019.12.02
% 作者:Leetion
[iLimit,jLimit] = size(InputImage);
OutImage = double(InputImage);
switch(Direction)
    case 1
        ConvAarray =double([1 2 1;0 0 0;-1 -2 -1]);
        for yIndex = 2:iLimit-1
            for xIndex = 2:jLimit-1
                NeighbourArray = [InputImage(yIndex-1,xIndex-1) InputImage(yIndex-1,xIndex) InputImage(yIndex-1,xIndex+1);...
                    InputImage(yIndex,xIndex-1) InputImage(yIndex,xIndex) InputImage(yIndex,xIndex+1);...
                    InputImage(yIndex+1,xIndex-1) InputImage(yIndex+1,xIndex) InputImage(yIndex+1,xIndex+1)];
                OutImage(yIndex,xIndex) = abs(sum(sum(ConvAarray.*double(NeighbourArray))));
            end
        end
    case 2
        ConvAarray  =double([1 0 -1;2 0 -2;1 0 -1]);
        for yIndex = 2:iLimit-1
            for xIndex = 2:jLimit-1
                NeighbourArray = [InputImage(yIndex-1,xIndex-1) InputImage(yIndex-1,xIndex) InputImage(yIndex-1,xIndex+1);...
                    InputImage(yIndex,xIndex-1) InputImage(yIndex,xIndex) InputImage(yIndex,xIndex+1);...
                    InputImage(yIndex+1,xIndex-1) InputImage(yIndex+1,xIndex) InputImage(yIndex+1,xIndex+1)];
                OutImage(yIndex,xIndex) = abs(sum(sum(ConvAarray.*double(NeighbourArray))));
            end
        end
    case 0
        ConvAarray1 =double([1 2 1;0 0 0;-1 -2 -1]);
        ConvAarray2 = double([1 0 -1;2 0 -2;1 0 -1]);
        OutImage1 = double(InputImage);
        OutImage2 = double(InputImage);
        for yIndex = 2:iLimit-1
            for xIndex = 2:jLimit-1
                NeighbourArray = [InputImage(yIndex-1,xIndex-1) InputImage(yIndex-1,xIndex) InputImage(yIndex-1,xIndex+1);...
                    InputImage(yIndex,xIndex-1) InputImage(yIndex,xIndex) InputImage(yIndex,xIndex+1);...
                    InputImage(yIndex+1,xIndex-1) InputImage(yIndex+1,xIndex) InputImage(yIndex+1,xIndex+1)];
                OutImage1(yIndex,xIndex) = sum(sum(ConvAarray1.*double(NeighbourArray)));
                OutImage2(yIndex,xIndex) = sum(sum(ConvAarray2.*double(NeighbourArray)));
                OutImage(yIndex,xIndex) = (abs(OutImage1(yIndex,xIndex))+abs(OutImage2(yIndex,xIndex)));
                %                 OutImage(yIndex,xIndex) = uint8(sqrt(double((OutImage1(yIndex,xIndex))^2+abs(OutImage2(yIndex,xIndex))^2)));
            end
        end
end
OutImage = mat2gray(OutImage);
end

1.2Prewitt算子边缘检测

function OutImage = PrewittOperate(InputImage,Direction)
%================================================================
% 功能:Prewitt边缘检测
% 参数:InputImage为输入单通道图像,Dirction为模板方向,
% Direction=1水平,Direction=1垂直,Direction=1综合
% 返回值:OutImage为InputImage同维数组
% 主要思路:利用Prewitt算子,计算相关
% 备注:如果图像为多通道则需要重复调用
% 调用方法:OutImage = FilterGauss(InputImage)
% 日期:2019.12.02
% 作者:Leetion
[iLimit,jLimit] = size(InputImage);
OutImage = double(InputImage);
switch(Direction)
    case 1
        ConvAarray = double([1 1 1;0 0 0;-1 -1 -1]);
        for yIndex = 2:iLimit-1
            for xIndex = 2:jLimit-1
                NeighbourArray = [InputImage(yIndex-1,xIndex-1) InputImage(yIndex-1,xIndex) InputImage(yIndex-1,xIndex+1);...
                    InputImage(yIndex,xIndex-1) InputImage(yIndex,xIndex) InputImage(yIndex,xIndex+1);...
                    InputImage(yIndex+1,xIndex-1) InputImage(yIndex+1,xIndex) InputImage(yIndex+1,xIndex+1)];
                OutImage(yIndex,xIndex) = abs(sum(sum(ConvAarray.*double(NeighbourArray))));
            end
        end
    case 2
        ConvAarray  = double([1 0 -1;1 0 -1;1 0 -1]);
        for yIndex = 2:iLimit-1
            for xIndex = 2:jLimit-1
                NeighbourArray = [InputImage(yIndex-1,xIndex-1) InputImage(yIndex-1,xIndex) InputImage(yIndex-1,xIndex+1);...
                    InputImage(yIndex,xIndex-1) InputImage(yIndex,xIndex) InputImage(yIndex,xIndex+1);...
                    InputImage(yIndex+1,xIndex-1) InputImage(yIndex+1,xIndex) InputImage(yIndex+1,xIndex+1)];
                OutImage(yIndex,xIndex) = abs(sum(sum(ConvAarray.*double(NeighbourArray))));
            end
        end
    case 0
        ConvAarray1 = double([1 1 1;0 0 0;-1 -1 -1]);
        ConvAarray2 = double([1 0 -1;1 0 -1;1 0 -1]);
        OutImage1 = double(InputImage);
        OutImage2 = double(InputImage);
        for yIndex = 2:iLimit-1
            for xIndex = 2:jLimit-1
                NeighbourArray = [InputImage(yIndex-1,xIndex-1) InputImage(yIndex-1,xIndex) InputImage(yIndex-1,xIndex+1);...
                    InputImage(yIndex,xIndex-1) InputImage(yIndex,xIndex) InputImage(yIndex,xIndex+1);...
                    InputImage(yIndex+1,xIndex-1) InputImage(yIndex+1,xIndex) InputImage(yIndex+1,xIndex+1)];
                OutImage1(yIndex,xIndex) = sum(sum(ConvAarray1.*double(NeighbourArray)));
                OutImage2(yIndex,xIndex) = sum(sum(ConvAarray2.*double(NeighbourArray)));
                OutImage(yIndex,xIndex) = abs(OutImage1(yIndex,xIndex))+abs(OutImage2(yIndex,xIndex));
%                 OutImage(yIndex,xIndex) = uint8(sqrt(double((OutImage1(yIndex,xIndex))^2+abs(OutImage2(yIndex,xIndex))^2)));
            end
        end
end
OutImage = mat2gray(OutImage);
end

1.3Roberts算子边缘检测

function OutImage = RobertsOperate(InputImage,Direction)
%================================================================
% 功能:Roberts边缘检测
% 参数:InputImage为输入单通道图像,Dirction为模板方向,
% Direction=1水平,Direction=1垂直,Direction=1综合
% 返回值:OutImage为InputImage同维数组
% 主要思路:利用Roberts算子,计算相关
% 备注:如果图像为多通道则需要重复调用
% 调用方法:OutImage = FilterGauss(InputImage)
% 日期:2019.12.02
% 作者:Leetion
[iLimit,jLimit] = size(InputImage);
OutImage = double(InputImage);
switch(Direction)
    case 1
        ConvAarray = double([-1 0;0 1]);
        for yIndex = 1:iLimit-1
            for xIndex = 1:jLimit-1
                NeighbourArray = [ InputImage(yIndex,xIndex) InputImage(yIndex,xIndex+1);...
                    InputImage(yIndex+1,xIndex) InputImage(yIndex+1,xIndex+1)];
                OutImage(yIndex,xIndex) = abs(sum(sum(ConvAarray.*double(NeighbourArray))));
            end
        end
    case 2
        ConvAarray  = double([0 -1;1 0]);
        for yIndex = 1:iLimit-1
            for xIndex = 1:jLimit-1
                NeighbourArray = [ InputImage(yIndex,xIndex) InputImage(yIndex,xIndex+1);...
                    InputImage(yIndex+1,xIndex) InputImage(yIndex+1,xIndex+1)];
                OutImage(yIndex,xIndex) = abs(sum(sum(ConvAarray.*double(NeighbourArray))));
            end
        end
    case 0
        ConvAarray1 = double([-1 0;0 1]);
        ConvAarray2 = double([0 -1;1 0]);
        OutImage1 = double(InputImage);
        OutImage2 = double(InputImage);
        for yIndex = 1:iLimit-1
            for xIndex = 1:jLimit-1
               NeighbourArray = [ InputImage(yIndex,xIndex) InputImage(yIndex,xIndex+1);...
                    InputImage(yIndex+1,xIndex) InputImage(yIndex+1,xIndex+1)];
                OutImage1(yIndex,xIndex) = double(sum(sum(ConvAarray1.*double(NeighbourArray))));
                OutImage2(yIndex,xIndex) = double(sum(sum(ConvAarray2.*double(NeighbourArray))));
                OutImage(yIndex,xIndex) = (abs(OutImage1(yIndex,xIndex))+abs(OutImage2(yIndex,xIndex)));
                %                 OutImage(yIndex,xIndex) = uint8(sqrt(double((OutImage1(yIndex,xIndex))^2+abs(OutImage2(yIndex,xIndex))^2)));
            end
        end
end
OutImage = mat2gray(OutImage);
end

1.4LoG算子边缘检测

function OutImage = LogOperate(InputImage)
% 功能:LoG边缘检测
% 参数:InputImage为输入单通道图像
% 返回值:OutImage为InputImage同维数组
% 主要思路:利用LoG算子,计算相关
% 备注:如果图像为多通道则需要重复调用
% 调用方法:OutImage = LogOperate(InputImage)
% 日期:2019.12.02
% 作者:Leetion
[iLimit,jLimit] = size(InputImage);
OutImage = double(InputImage);
ConvAarray = [0 0 -1 0 0;0 -1 -2 -1 0;-1 -2 16 -2 -1;0 -1 -2 -1 0; 0 0 -1 0 0];
for yIndex = 3:iLimit-2
    for xIndex = 3:jLimit-2
        NeighbourArray = [InputImage(yIndex-2,xIndex-2) InputImage(yIndex-2,xIndex-1) InputImage(yIndex-2,xIndex) InputImage(yIndex-2,xIndex+1) InputImage(yIndex-2,xIndex+2);...
            InputImage(yIndex-1,xIndex-2) InputImage(yIndex-1,xIndex-1) InputImage(yIndex-1,xIndex) InputImage(yIndex-1,xIndex+1) InputImage(yIndex-1,xIndex+2);...
            InputImage(yIndex,xIndex-2) InputImage(yIndex,xIndex-1) InputImage(yIndex,xIndex) InputImage(yIndex,xIndex+1) InputImage(yIndex,xIndex+2);...
            InputImage(yIndex+1,xIndex-2) InputImage(yIndex+1,xIndex-1) InputImage(yIndex+1,xIndex) InputImage(yIndex+1,xIndex+1) InputImage(yIndex+1,xIndex+2);...
            InputImage(yIndex+2,xIndex-2) InputImage(yIndex+2,xIndex-1) InputImage(yIndex+2,xIndex) InputImage(yIndex+2,xIndex+1) InputImage(yIndex+2,xIndex+2)];
        OutImage(yIndex,xIndex) = abs(sum(sum(ConvAarray.*double(NeighbourArray))));
    end
end
OutImage  = mat2gray(OutImage);
end


2.边缘检测测试脚本测试脚本

2.1Sobel算子边缘检测测试脚本

%================================================================
% 功能:Sobel边缘测试
% 主要思路:
% 备注:
% 日期:2019.12.02
% 作者:Leetion
clc,clear
close all 
InputImage = imread("rec1.bmp");
InputImage=double(InputImage);
% InputImage = imnoise(InputImage,'salt & pepper');
subplot(2,2,1)
imshow(InputImage);
title("原图");
subplot(2,2,2)
OutImage = SobelOperate(InputImage,1);
imshow(OutImage);
title("横向");
subplot(2,2,3)
OutImage = SobelOperate(InputImage,2);
imshow(OutImage);
title("纵向");
subplot(2,2,4)
OutImage = SobelOperate(InputImage,0);
imshow(OutImage);
title("综合");


2.2Prewitt算子边缘检测测试脚本测试脚本

%================================================================
% 功能:Prewitt边缘测试
% 主要思路:
% 备注:
% 日期:2019.12.02
% 作者:Leetion
clear all
close all 
InputImage = imread("rec1.bmp");
subplot(2,2,1)
imshow(InputImage);
title("原图");
subplot(2,2,2)
OutImage = PrewittOperate(InputImage,1);
imshow(OutImage);
title("横向");
subplot(2,2,3)
OutImage = PrewittOperate(InputImage,2);
imshow(OutImage);
title("纵向");
subplot(2,2,4)
OutImage = PrewittOperate(InputImage,0);
imshow(OutImage);
title("综合");

2.3Roberts算子边缘检测测试脚本

%================================================================
% 功能:Roberts边缘测试
% 主要思路:
% 备注:
% 日期:2019.12.02
% 作者: Leetion
clear all
close all 
InputImage = imread("rec2.bmp");
% InputImage = imnoise(InputImage,'salt & pepper');
subplot(2,2,1)
imshow(InputImage);
title("原图");
subplot(2,2,2)
OutImage = RobertsOperate(InputImage,1);
imshow(OutImage);
title("45°");
subplot(2,2,3)
OutImage = RobertsOperate(InputImage,2);
imshow(OutImage);
title("135°");
subplot(2,2,4)
OutImage = RobertsOperate(InputImage,0);
imshow(OutImage);
title("综合");

2.4LoG算子边缘检测测试脚本

%================================================================
% 功能:LoG算子测试
% 主要思路:
% 备注:
% 日期:2019.12.02
% 作者:Leeton
clc,clear
close all 
InputImage = imread("rec1.bmp");
% InputImage = imnoise(InputImage,'salt & pepper');
subplot(1,2,1)
imshow(InputImage);
title("原图");
subplot(1,2,2)
OutImage = LogOperate(InputImage);
imshow(OutImage);
title("LoG边缘检测");

3.边缘检测结果

3.1Sobel算子边缘检测结果

数字图像处理-Matlab实现图像边缘检测_第1张图片 Fig1.Sobel算子边缘检测

3.2Prewitt算子边缘检测结果

数字图像处理-Matlab实现图像边缘检测_第2张图片 Fig2.Prewitt算子边缘检测

3.3Roberts算子边缘检测结果

数字图像处理-Matlab实现图像边缘检测_第3张图片 Fig3.Roberts算子边缘检测

3.4LoG算子边缘检测结果

数字图像处理-Matlab实现图像边缘检测_第4张图片 Fig4.LoG算子边缘检测

4.探究噪声对边缘检测的影响

4.1噪声对Sobel算子的影响

数字图像处理-Matlab实现图像边缘检测_第5张图片 Fig5.Sobel加噪

4.2噪声对Prewitt的影响

数字图像处理-Matlab实现图像边缘检测_第6张图片 Fig6.Prewitt加噪

4.3噪声对Roberts的影响

数字图像处理-Matlab实现图像边缘检测_第7张图片 Fig7.Roberts加噪

4.4噪声对LoG的影响

数字图像处理-Matlab实现图像边缘检测_第8张图片 Fig8.LoG加噪

 

你可能感兴趣的:(数字图像处理,Matlab,数字图像处理,边缘检测,Sobel,Prewitt)