本文采用了LoG算子,sobel算子,prewitt算子,roberts算子,小波变换五种方法进行图像边缘检测
一、LoG算子,即Laplacian of Gaussian(高斯拉普拉斯)算子,是一种在图像处理和计算机视觉中广泛使用的边缘检测算子。它结合了高斯平滑和拉普拉斯边缘检测的特点,旨在减少噪声干扰的同时有效地提取图像边缘。LoG算子首先对图像应用高斯平滑,然后对平滑后的图像应用拉普拉斯算子。这个过程可以用下面的数学表达式描述:
特点:
噪声抑制:通过先进行高斯平滑,LoG算子减少了噪声对边缘检测的干扰。
定义LoG算子的掩膜
w=[-2 -4 -4 -4 -2;-4 0 8 0 -4;-4 8 24 8 -4;-4 0 8 0 -4;-2 -4 -4 -4 -2];
二、Sobel算子,利用图像的一阶导数来检测边缘,这些边缘通常对应于图像强度的显著变化
-
梯度计算:
Sobel算子通过计算图像在水平和垂直方向上的梯度来检测边缘。梯度是图像强度变化的度量,边缘通常出现在梯度幅度较大的地方。 -
卷积操作:
Sobel算子使用两个3x3的核(一个用于水平方向,一个用于垂直方向)与图像进行卷积操作。这些核分别检测水平和垂直方向上的边缘。 - 核的定义:
水平方向的Sobel核(用于检测垂直边缘):
垂直方向的Sobel核(用于检测水平边缘):
三、prewitt算子,与Sobel算子类似,Prewitt算子通过计算图像在水平和垂直方向上的梯度来检测边缘。
水平方向的Prewitt核(用于检测垂直边缘):
垂直方向的Prewitt核(用于检测水平边缘):
四、roberts算子,是一种基于对角线方向的一阶导数算子,Roberts算子使用两个2x2的核来近似图像的一阶导数,从而检测水平和垂直方向上的边缘。
水平边缘检测核:
垂直边缘检测核:
五、小波变换,本文采用haar小波基,后续会出一篇基于小波变换的图像边缘检测
五种边缘检测的实现:
这里对小波变换边缘检测进行了形态学操作,边缘检测效果更好。
clc,clear;
X=imread('Test Figure.tif');
X1=rgb2gray(X);
BW_sobel=edge(X1,'sobel');%使用sobel算子
BW_prewitt=edge(X1,'prewitt');%使用prewitt算子
BW_roberts=edge(X1,'roberts');%使用roberts算子
w=[-2 -4 -4 -4 -2;-4 0 8 0 -4;-4 8 24 8 -4;-4 0 8 0 -4;-2 -4 -4 -4 -2];%LoG算子的掩膜
BW_log=imfilter(X1,w);%使用LoG算子
% 小波变换参数
waveletName = 'haar'; % 小波基
level = 1; % 分解层数
% 小波分解
[C, S] = wavedec2(X1, level, waveletName);
% 提取细节系数(水平、垂直、对角线)
[H, V, D] = detcoef2('all', C, S, level);
% 边缘检测 - 利用小波细节系数
edge_image = sqrt(H.^2 + V.^2 + D.^2);
% 形态学操作 - 膨胀和腐蚀
se = strel('disk', 1);
edge_image_dilated = imdilate(edge_image, se);
edge_image_eroded = imerode(edge_image_dilated, se);
subplot(2,3,1),imshow(X),title('原图');
subplot(2,3,2),imshow(BW_log>200),title('log算子');%显示二值图像,像素大于200则为1
subplot(2,3,3),imshow(edge_image,[]),title('小波变换');
subplot(2,3,4),imshow(BW_sobel),title('sobel算子');
subplot(2,3,5),imshow(BW_prewitt),title('prewitt算子');
subplot(2,3,6),imshow(BW_roberts),title('roberts算子');
效果如下: