边缘检测算法

边缘检测

边缘是图像最基本的特征,所谓边缘就是指周围灰度强度有反差变化的那些像素的集合,是图像分割所依赖的重要基础,也是纹理分析和图像识别的重要基础。理想的边缘检测应当正确解决边缘的有无、真假、和定向定位。

从人的直观感受来说,边缘对应于物体的几何边界。图像上灰度变化剧烈的区域比较符合这个要求,一般会以这个特征来提取图像的边缘。

当遇到包含纹理的图像,例如图像中的人穿了黑白格子的衣服,一般的算法提取的边缘会把衣服上的纹理提取,如图1所示。但是这种图像我们往往不希望提取出来的边缘包括衣服上的方格,这就又涉及到纹理图像的处理等方法。

从数学上解决该问题最直观的方法就是微分(对于数字图像来说就是差分),在信号处理的角度来看,也可以说是用高通滤波器,即保留高频信号。用于图像识别的边缘提取往往需要输出的边缘是二值图像,即只有黑白两个灰度的图像,其中一个灰度代表边缘,另一个代表背景。

一个常用的边缘检测流程的基本步骤为:

图像滤波:边缘检测的算法主要是基于图像强度的一阶和二阶导数,但是导数通常对噪声很敏感,因此必须采用滤波器来平滑噪声。常见的滤波器有高斯滤波器,即采用离散化的高斯函数产生一组归一化的高斯核,然后基于高斯核函数对图像的灰度矩阵进行卷积操作;
边缘增强:增强边缘的基础是确定图像各点领域强度的变化值。增强算法可以将图像灰度点邻阈强度值有显著变化的点凸显出来。在具体编程过程中,可以通过计算梯度幅值来确定;
**边缘检测:**经过增强的图像,往往邻域中有很多点的梯度值比较大,而在特定应用中,这些点并不是要找的边缘点,所以应该采用某些方法对这些点进行取舍。实际工程中,常用的方法是通过阈值化的方法进行检测。

图像梯度

边缘检测的实质是采用某种算法来提取出图像中对象与背景间的交界线,一般将边缘定义为图像中灰度发生急剧变化的区域边界。图像灰度的变化情况可以用图像灰度分布的梯度来反映,因此可以用局部图像微分技术来获得边缘检测算子。

这种灰度变化明显不明显怎样去定义呢?从微积分的知识中,可以知道微分就是求函数的变化率,即导数(梯度)。那么对于图像来说,可不可以用微分来表示图像灰度的变化率呢?答案是肯定的,因为图像实际上就是函数。

经典的边界提取技术大都基于微分运算。首先通过平滑来滤除图像中的噪声,然后进行一阶微分或二阶微分运算,求得梯度最大值或二阶导数的过零点,最后选取适当的阈值来提取边界。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

使用梯度对图像增强

图像梯度可以对图像中的有用信息进行增强,它可以是一个失真的过程,其目的是要改善图像的视觉效果,针对给定图像的应用场合。
有目的地强调图像的整体或局部特性,将原来不清晰的图像变得清晰或强调某些感兴趣的特征,扩大图像中不同物体特征之间的差别,抑制不感兴趣的特征,使之改善图像质量、丰富信息量,加强图像判读和识别效果,满足某些特殊分析的需要。
在这里插入图片描述
在这里插入图片描述

使用梯度增强图像只需要把梯度与原图做加法即可。例如,求出图4中图像的梯度。首先要读取图片,使用灰度图模式读取:

earth = cv2.imread(“earth.png”, 0)
读取的灰度图如图5所示:

在这里插入图片描述
图 5 示例图像的灰度图
对图5使用前面介绍的图像梯度公式:

gx = abs(earth[x + 1, y] - earth[x, y])
gy = abs(earth[x, y + 1] - earth[x, y])
gradient[x, y] = gx + gy

可以得到梯度图像如图6所示。很明显的可以看出,计算得到的梯度把明暗边界提出了出来。
在这里插入图片描述

使用该梯度,对图5的灰度图进行图像增强:

sharp = moon + gradient

效果图见图7所示:
在这里插入图片描述

可以看出,增强后的图7要比图5更加明亮,并且细节部分更加突出。

Roberts 算子的基本原理

Roberts 算子是利用局部差分寻找边缘的一种算子,是最简单的边缘检测算子。Roberts 算子利用对角线方向相邻两像素之差近似梯度幅值来检测边缘,检测垂直边缘的效果要优于其他方向边缘,定位精度高,但对噪声的抑制能力较弱。边缘检测算子检查每个像素的邻域并对灰度变化率进行量化,同时也包含方向的确定。
在这里插入图片描述
Roberts 算子边缘定位准,但是对噪声敏感。常用来处理具有陡峭的低噪声图像,当图像边缘接近于正45度或负45度时,该算法处理效果更理想。它适用于边缘明显而且噪声较少的图像分割,在应用中经常用 Roberts 算子来提取道路。其缺点是对边缘的定位不太准确,提取的边缘线条较粗。

在 Python 中,Roberts 算子主要通过 Numpy 定义卷积模板,再调用 OpenCV 的 filter2D() 函数实现边缘提取。该函数主要是利用内核实现对图像的卷积运算,其函数原型如下所示:

dst = filter2D(src, ddepth, kernel[, dst[, anchor[, delta[, borderType]]]])

其中参数为:

src:表示输入图像;
ddepth:表示目标图像所需的深度;
kernel:表示卷积核,一个单通道浮点型矩阵;
dst:表示输出的边缘图,其大小和通道数与输入图像相同;
anchor:表示内核的基准点,其默认值为(-1,-1),位于中心位置;
delta:表示在储存目标图像前可选的添加到像素的值,默认值为0;
borderType:表示边框模式,更多详细信息查阅 BorderTypes。

使用 Roberts 算子提取边缘

下面通过一个例子来演示如何使用 Roberts 算法提取图像边缘。
1) 首先读取图1示例图片:

img = cv2.imread('hangmu.png')

在这里插入图片描述
2) 对读取的图做灰度处理:

grayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

处理后的图像如图2所示。

接下来就是定义 Roberts 算子。该算子的数学定义已经介绍,在这里使用 Numpy 来定义卷积模板:

kernelx = np.array([[-1, 0], [0, 1]], dtype=int)
kernely = np.array([[0, -1], [1, 0]],</
  • 30
    点赞
  • 207
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值