边缘检测最通用的方法是检测亮度的不连续。
在第10章的图像分割这一章节中写道,边缘检测的基本概念是用以下两个基本准则之一,在图片中寻找亮度发生快速变化的位置:
寻找亮度的一阶导数的幅度比指定阈值大的地方
寻找亮度的二阶导数中有零交叉的地方
Sobel算子:是一阶导数的边缘检测算子,在算法实现过程中,通过3×3模板,根据像素点上下、左右邻点灰度加权差,在边缘处达到极值这一现象检测边缘。
一、Sobel算子的边缘检测
- 灰度
I =rgb2gray(F);
- 使用edge函数的边缘检测
BW1 = edge(I,'log',0.003); % σ=2
用不同σ值的LoG算子检测图像的边缘
- 代码
F = imread('图片1.png');
I =rgb2gray(F);
BW1 = edge(I,'Sobel',0.04);
subplot 121;imshow(F) ;title('原始图像');
subplot 122;imshow(BW1);title('Sobel算子的处理结果')
- 结果
二、LoG算子的边缘检测
- 灰度
I =rgb2gray(F);
- 平滑函数,使用edge函数的边缘检测
BW1 = edge(I,'log',0.003); % σ=2
用不同σ值的LoG算子检测图像的边缘
- 代码
F = imread('图片1.png');
I =rgb2gray(F);
BW1 = edge(I,'log',0.003); % σ=2
BW2 = edge(I,'log',0.003,3); % σ=3
subplot 121;imshow(BW1);title('σ=2')
subplot 122;imshow(BW2);title('σ=3')
- 结果
可以看到σ=2,与σ=3的结果图像的模糊程度还是很大不同的。因为σ是标准差,图片的模糊程度由σ决定。
三、Canny算子的边缘检测
与前面两种算子相似,使用edge函数进行实现。
Canny算子是edge函数中最强的
- 灰度
I =rgb2gray(F);
- 使用edge函数的边缘检测
BW1 = edge(I,'canny',0.003,2);
- 代码
F = imread('图片1.png');
I =rgb2gray(F);
BW1 = edge(I,'canny',0.003,2);
subplot 121;imshow(F) ;title('原始图像');
subplot 122;imshow(BW1);title('canny算子的处理结果')