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
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
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
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
%================================================================
% 功能: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("综合");
%================================================================
% 功能: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("综合");
%================================================================
% 功能: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("综合");
%================================================================
% 功能: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边缘检测");