问题: 我在提取图像边缘的时候,首先对图像进行灰度变换,之后进行二值处理,最后进行边缘检测得到边缘图像。
但是在查阅资料的过程中我经常发现很多人忽略二值化的步骤,直接进行边缘检测;还有很多人在实现某些功能的时候先进行边缘检测之后再阈值分割,让我感到非常迷惑,这篇文章旨在探求二者的关系。
首先要知道图像二值化和边缘检测的目的。
图像的阈值处理一般使得图像的像素值更单一、图像更简单。阈值可以分为全局阈值和局部阈值,可以是单阈值也可以是多阈值。
图像二值化是设置单阈值,为了将图像中感兴趣的像素分离出来作为前景像素,不感兴趣的部分作为背景像素。
最简单的二值化 *** 作是使用以下函数:(这是全局化的阈值)
上述的二值化处理是设置一个全局阈值,让所有像素值与该阈值比较,下面还可以通过自适应阈值实现图像的二值化处理。
自适应阈值不需要确定一个固定的阈值,根据其对应的自适应方法,通过图像的局部特征自适应的设定阈值,做出二值化处理。
自适应阈值是一种局部阈值,要在图像中确定一个区域,求出该区域内的像素平均值,再与阈值比较
adaptiveMethod - 指定计算阈值的方法。
cv2ADPTIVE_THRESH_MEAN_C:阈值取相邻区域的平均值
cv2ADPTIVE_THRESH_GAUSSIAN_C:阈值取相邻区域的加权和,权重为一个高斯窗口。
thresholdType - 和上面一样
blockSize - 邻域大小(用来计算阈值的区域大小),计算图像的像素区域一般取3×3、5×5、7×7
C - 常数,阈值等于平均值或者加权平均值减去这个常数。该参数用于微调阈值,可以为负数
还有一种非常多人提及的方法——Otsu’s 二值化,这种方法下次再记录。
要对图像进行边缘检测,首先对图像进行灰度变换,使图像只包含一个通道的信息,然后比较各相邻像素间的亮度差别,亮度产生突变的地方就是边缘像素,将这些边缘像素点连接到一起就形成了边缘图像。
那么首先要知道如何检测出边缘:
边缘有方向和幅值两个要素,通常对图像相邻域像素求取梯度来描述和检测边缘。
为何要求梯度?
图像梯度是对多个方向分别求偏导得到的导数组。比如下图是亮度在x方向上变化,在y方向上没有变化,所以此时只需对x求偏导,该处关于y的偏导为0。
同样图像的亮度在y轴变化时,x方向的偏导为0。
我们知道,当一个函数在某处变化大的时候,它的导数在该处得到极值。
可以看到,图像由亮变暗时函数陡然下降,导数得到极小值,由暗变亮时函数又陡然上升,导数得到极大值,接下来只要找到导数的峰值就行。
这里主要了解Canny边缘检测算法。
Canny算子首先对图像进行平滑滤波,滤除图像的噪声以减少噪声对图像边缘检测的干扰。
下面这两篇文章对Canny算子的介绍非常清晰,在此附上链接以供学习。
>
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)