边缘检测(图像边缘检测)

http://www.itjxue.com  2023-01-26 16:43  来源:未知  点击次数: 

Canny边缘检测

Canny边缘检测是一种使用多种边缘检测算法检测边缘的方法。由John F.Canny于1986年提出,并在论文中有详尽的描述。

1)去噪。噪声会影响边缘检测的准确度。通常采用高斯滤波去除图像中的噪声。滤波器的核越大,边缘信息对噪声的敏感度就越低。不过,核越大,边缘检测的定位错误也会随之增加。通常一个5 X 5的核能满足大多数情况。

2)计算梯度的幅度与方向。梯度的方向与边缘的方向是垂直的,通常就取近似值为·水平、垂直、对角线等八个不同的方向。

3)非极大值抑制,即适当地让边缘变瘦。在获得了梯度的幅度和方向后,遍历图像中的像素点,去除所有非边缘的点。具体实现上,判断当前像素点是否是周围像素点中具有相同梯度方向的最大值,如果是,则保留该点;如果不是则抑制(归零)。

4)确定边缘。用双阈值算法确定最终的边缘信息。完成之前三步骤后,图像的强边缘已经在当前获取的边缘图像内。但一些虚边缘可能也在边缘图像内,这些虚边缘可能是真实的图像产生的,也可能是由于噪声产生的(必须将其剔除)。

? ? ????设置两个阈值,其中一个为高阈值maxVal,另一个为低阈值minVal。根据当前边缘像素的梯度值与这两个阈值之间的关系,判断边缘的属性。如果当前边缘像素的梯度值不小于maxVal,则将当前边缘像素标记为强边缘;如果介于maxVal与minVal之间,则标记为弱边缘(先保留);如果小于minVal,则抑制当前边缘像素。之后再判断虚边缘是否与强边缘有连接,有连接,则处理为边缘;无连接则抑制。

OpenCV提供了cv2.Canny()来实现边缘检测:

dst : 为计算得到的边缘图像

image: 为8位输入图像

threshold1: 表示处理过程中的的第一个阈值

threshold2: 表示处理过程中的的第二个阈值

apertureSize: 表示Sobel算子的孔径大小。

L2gradient: 为计算图像梯度幅度的标识。其默认值是False。如果为True,则使用更精确的L2范数进行计算,否则使用L1范数。

例如:

边缘检测是什么意思

两个具有不同灰度值的相邻区域之间总存在边缘,边缘是灰度值不连续的表现。由于边缘是图像上灰度变化最剧烈的地方,传统的边缘检测就是利用了这个特点,对图像各个像素点进行微分或求二阶微分来确定边缘像素点。

以下是一段函数是关于边缘检测的一些算法,希望对你有帮助。。

I=imread('D:\10.jpg'); %读取图像

I1=im2double(I); %将彩图序列变成双精度

I2=rgb2gray(I1); %将彩色图变成灰色图

[thr, sorh, keepapp]=ddencmp('den','wv',I2);

I3=wdencmp('gbl',I2,'sym4',2,thr,sorh,keepapp); %小波除噪

I4=medfilt2(I3,[9 9]); %中值滤波

I5=imresize(I4,0.8,'bicubic'); %图像大小

BW1=edge(I5,'sobel'); %sobel 图像边缘提取

BW2=edge(I5,'roberts'); %roberts 图像边缘提取

BW3=edge(I5,'prewitt'); %prewitt 图像边缘提取

BW4=edge(I5,'log'); %log 图像边缘提取

BW5=edge(I5,'canny'); %canny 图像边缘提取

h=fspecial('gaussian',5); %高斯滤波

BW6=edge(I5,'zerocross',[ ],h); %zerocross 图像边缘提取

figure;

subplot(1,3,1); %图划分为一行三幅图,第一幅图

imshow(I2); %绘图

title(' 原始图像'); %标注

subplot(1,3,2); %第二幅图

imshow(I3);

title(' 消噪后图像');

subplot(1,3,3); %第三幅图

imshow(I4);

title(' 中值滤波图像');

figure;

subplot(1,3,1);

imshow(BW1);

title('Sobel 算子');

subplot(1,3,2);

imshow(BW2);

title('Roberts 算子');

subplot(1,3,3);

imshow(BW3);

title('Prewitt 算子');

figure;

subplot(1,3,1);

imshow(BW4);

title('log 算子');

subplot(1,3,2);

imshow(BW5);

title('Canny 算子');

subplot(1,3,3);

imshow(BW6);

title('Zerocross');

边缘检测

1. 关于边缘模式的算法

边缘指的是图像内出现的明部和暗部的边界。边缘检测则是通过图像处理检测出该浓度变化的边界。可通过以下

4 个流程检测边缘。

2. 关于边缘模式的参数设置

想从倾斜边缘或多个候补中检测出任意边缘时,光靠初始值可能无法顺利进行。

此时调整设置参数,就可以稳定检测。

接下来解说常用的 2 个参数。

3. 使边缘检测更加稳定的预处理滤波器

在测量区域内向指定方向扫描进行边缘检测的区段,然后测量各个区段的边缘位置。在 1个 测量区域中可测量多个边缘位置信息,因此除了整体平均、最大、最小之外,还可以检测出以个别测量结果和全部测量结果为点群的圆形和直线。

4. 使边缘检测更加稳定的预处理滤波器

边缘检测中,如何抑制边缘偏差成为关键所在。作为使边缘检测稳定的高效滤波器,“中值”和“平均化”最为人们所熟知。接下来对这些预处理滤波器的特征和高效选定方法进行说明。

.首先明白所谓“零交叉”的概念。

在求图像边缘的时候如果计算一阶导数的边缘检测器如:(a) Roberts交叉算子(b)Sobel算子(c) Prewitt算子,会导致检测的边缘点太多;一种更好的方法就是求梯度局部最大值对应的点,并认定它们是边缘点,如下图所示,若用阈值来进行边缘检测,则在a和b之间的所有点都被记为边缘点,这就是为什么计算一阶导数的边缘检测器会导致检测的边缘点太多.但通过去除一阶导数中的非局部最大值,可以检测出更精确的边缘.一阶导数的局部最大值对应着二阶导数的 零交点 这意味着在边缘点处有一阶导数的峰值,同样地,有二阶导数的零交叉点.这样,通过找图像强度的二阶导数的零交叉点就能找到边缘点。在二维空间,对应二阶导数有两种算子:拉普拉斯算子和二阶方向导数。

以一维函数f(x)(阶跃边缘) 与f'(x)及f''(x)的对应关系来理解这个概念。

2.在零交叉点概念的基础上明白Canny 边缘检测器处理的图像的步骤:

step1.用高斯滤波器平滑图像.

step2.用一阶偏导的有限差分来计算梯度的幅值和方向.

step3.对梯度幅值应用非极大值抑制.

step4.用双阈值算法检测和连接边缘.

3.Canny算子中特别之处在步骤3和步骤4中体现;

首先,步骤三中不是仅仅把图像快速变化的问题转化成求幅值阵列的局部最大值问题.为确定边缘,增加了细化幅值图像中的屋脊带,即根据3*3领域中心点的扇区值决定的梯度方向,用领域中心点幅值与梯度方向上相邻的2个元素进行比较,只保留幅值局部变化最大的点.这一过程叫非极大值抑制(Non-Maxima Suppression,NMS ),它会生成细化的边缘.

另外,步骤4中用了双阈值技术,双阈值算法对非极大值抑制图像作用双阈值t1和t2,且t2约为t1的两倍,得到两个阈值边缘图像T1[i,j]和T2[i,j].由于图像T2[i,j]是用高阈值得到的,因此它含有很少的假边缘,但T2[i,j]可能在轮廓上有间断(太多的假错误).双阈值法要在T2[i,j]中把边缘连接成轮廊,当到达轮廊的端点时,该算法就在T1[i,j]的8-邻点位置寻找可以连接到轮廊上的边缘,这样,算法将不断地在T1[i,j]中收集边缘,直到将T2[i,j]中所有的间隙连接起来为止.这一算法是阈值化的副产物,并解决了阈值选择的一些问题.

(责任编辑:IT教学网)

更多

推荐微软认证文章