【火炉炼AI】机器学习046-图像边缘的检测方法

【火炉炼AI】机器学习046-图像边缘的检测方法

(本文所使用的Python库和版本号: Python 3.6, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2 )

图像中各种形状的检测时计算机视觉领域中非常常见的技术之一,特别是图像中直线的检测,圆的检测,图像边缘的检测等,下面我们来研究一下如何快速检测图像边缘。

边缘是不同区域的分界线,是周围(局部)像素有显著变化的像素的集合,有幅值与方向两个属性。这个不是绝对的定义,主要记住边缘是局部特征以及周围像素显著变化产生边缘。

常见边缘检测算子:Roberts 、Sobel 、Prewitt、Laplacian、Log/Marr、Canny、Kirsch、Nevitia

1. Sobel算子

Sobel算子是图像边缘检测中最重要的算子之一,在机器学习中占有举足轻重的作用,在技术上,它是一个离散的一阶差分算子,用来计算图像亮度函数的一阶梯度之近似值。在图像的任何一点使用此算子,将会得到该点对应的梯度矢量或法矢量。

在计算公式上,Sobel算子包含有两组3*3的矩阵,分别为横向及纵向,将这两个矩阵与图像做平面卷积,即可分别得到横向及纵向的亮度差分近似值。所以这两个算子,一个是检测水平边缘的,另一个是检测垂直边缘的,与Prewitt算子相比,Sobel算子对于像素的位置的影响做了加权,可以降低边缘模糊程度,因此效果更好。

Sobel算子算法的优点是计算简单,速度快,但是由于只采用了两个方向的模板,只能检测水平和垂直方向的边缘,因此这种算法对于纹理较为复杂的图像,其边缘检测效果就不是很理想。该算法认为:凡灰度新值大于或等于阈值的像素点都是边缘点,这种判断不太合理,会造成边缘点的误判,因为许多噪声点的灰度值也很大。

import cv2
image=cv2.imread(‘E:\PyProjects\DataSet\FireAI/chair.jpg‘)
# Sobel 算子进行图像边缘检测
sobel_h=cv2.Sobel(image,cv2.CV_64F,1,0,ksize=3)
sobel_v=cv2.Sobel(image,cv2.CV_64F,0,1,ksize=3)
plt.figure(13,figsize=(15,30))

plt.subplot(131)
plt.imshow(image,cmap=‘gray‘) # 彩色图像显示异常,plt采用RGB模式,而cv2采用BGR模式
plt.title(‘raw_img‘)

plt.subplot(132)
plt.imshow(sobel_h,cmap=‘gray‘)
plt.title(‘sobel_h‘)

plt.subplot(133)
plt.imshow(sobel_v,cmap=‘gray‘)
plt.title(‘sobel_v‘)

Sobel算子需要优化的地方可能只有ksize一个参数了。ksize只能去1,3,5,7这四个数字。

2. Laplacian算子

Laplacian算子是N维欧几里得空间中的一个二阶微分算子,定义为梯度grad的散度div。此处不讲解这个算子的计算和原理,只讲解使用方法和效果

# Laplacian算子进行图像边缘检测
lap=cv2.Laplacian(image, cv2.CV_64F)
plt.figure(12,figsize=(10,30))

plt.subplot(121)
plt.imshow(image,cmap=‘gray‘) # 彩色图像显示异常,plt采用RGB模式,而cv2采用BGR模式
plt.title(‘raw_img‘)

plt.subplot(122)
plt.imshow(lap,cmap=‘gray‘)
plt.title(‘Laplacian‘)

3. Canny算子

Canny的目标是找到一个最优的边缘检测算法,最有边缘检测的含义是:

1,好的检测:算法能够尽可能多的标识出图像中的实际边缘。

2,好的定位:标识出的边缘要与实际图像中的实际边缘尽可能接近。

3,最小相应:图像中的边缘只能标识一次,并可能存在的图像噪声不应标识为边缘

为了满足这些要求,Canny使用了变分法,这是一种寻找满足特定功能的函数的方法,最优检测使用四个指数函数项的和表示,但是它非常近似于高斯函数的一阶导数。

Canny算法的步骤可以分为:降噪,寻找梯度,跟踪边缘。降噪是对原始图像与高斯平滑模板做卷积,得到的图像与原始图像相比有些轻微的模糊,这样做的目的是单独的像素噪声在经过高斯平滑处理后就变得几乎没有影响。

寻找梯度:Canny算子使用4个mask检测水平,垂直以及对角线方向的边缘,原始图像与每个mask所作的卷积都存储起来。对于每个点我们都标识在这个点上的最大值以及生成的边缘方向。这样我们就从原始图像生成了图像中每个点亮度梯度图以及亮度梯度的方向。

跟踪边缘:较高的亮度梯度比较有可能是边缘,但是没有一个确切的值来限定多大的亮度梯度是边缘,所以canny使用滞后阈值--高阈值和低阈值。

上述步骤完成之后,我们就得到了一个二值图,每点表示是否是一个边缘点。

# Canny算子
canny = cv2.Canny(image, 50, 240)
plt.figure(12,figsize=(10,30))

plt.subplot(121)
plt.imshow(image,cmap=‘gray‘) # 彩色图像显示异常,plt采用RGB模式,而cv2采用BGR模式
plt.title(‘raw_img‘)

plt.subplot(122)
plt.imshow(canny,cmap=‘gray‘)
plt.title(‘Canny‘)

Canny算子使用的一个难点在于高阈值和低阈值的选择,其实对于任何阈值的选择,都面临一个两难问题,设置的太高,可能会漏掉部分信息,设置的过低,会把噪声当做重要信号来处理,这一点,倒是很像机器学习中的准确率和召回率的关系。

Canny算子适用于不同的场合,它的参数允许根据不同实现的特定要求进行调整以识别不同的边缘特性。

########################小**********结###############################

1,此处讲解的三个边缘检测算子,使用起来都比较简单,比较难的是理解其内在本质含义。

2,从效果上来看,我个人比较倾向于Canny算子,因为从图片中可以看出,其噪声最少,得到的边缘效果最好。

#################################################################

注:本部分代码已经全部上传到(我的github)上,欢迎下载。

参考资料:

1, Python机器学习经典实例,Prateek Joshi著,陶俊杰,陈小莉译

原文地址:https://www.cnblogs.com/RayDean/p/9829080.html

时间: 2024-10-09 22:54:14

【火炉炼AI】机器学习046-图像边缘的检测方法的相关文章

【火炉炼AI】机器学习050-提取图像的Star特征

[火炉炼AI]机器学习050-提取图像的Star特征 (本文所使用的Python库和版本号: Python 3.6, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2 ) 对于图像的特征点,前面我们讨论过边缘检测方法,Harris角点检测算法等,这些检测算法检测的都是图像的轮廓边缘,而不是内部细节,如果要进一步提取图像内部细节方面的特征,需要用到SIFT特征提取器和Star特征提取器.上一篇我们讲解了SIFT特征提取器,下面我们来介绍Star特征提取器.

【火炉炼AI】机器学习048-Harris检测图像角点

[火炉炼AI]机器学习048-Harris检测图像角点 (本文所使用的Python库和版本号: Python 3.6, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2 ) 角点检测算法大致有三类:基于灰度图像的角点检测,基于二值图像的角点检测,基于轮廓曲线的角点检测.基于灰度图像的角点检测又可分为基于梯度.基于模板和基于模板梯度组合3类方法,其中基于模板的方法主要考虑像素领域点的灰度变化,即图像亮度的变化,将与邻点亮度对比足够大的点定义为角点.常见的基

【火炉炼AI】机器学习007-用随机森林构建共享单车需求预测模型

[火炉炼AI]机器学习007-用随机森林构建共享单车需求预测模型 (本文所使用的Python库和版本号: Python 3.5, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2 ) 共享单车是最近几年才发展起来的一种便民交通工具,基本上是我等屌丝上班,下班,相亲,泡妞必备神器.本项目拟使用随机森林回归器构建共享单车需求预测模型,从而查看各种不同的条件下,共享单车的需求量. 1. 准备数据集 本次使用的数据集来源于加利福尼亚大学欧文分校(UCI)大学的公

【火炉炼AI】机器学习006-用决策树回归器构建房价评估模型

[火炉炼AI]机器学习006-用决策树回归器构建房价评估模型 (本文所使用的Python库和版本号: Python 3.5, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2 ) 最近几十年,房价一直是中国老百姓心中永远的痛,有人说,中国房价就像女人的无肩带文胸,一半人在疑惑:是什么支撑了它?另一半人在等待:什么时候掉下去? 而女人,永不可能让它掉下来.就算快掉下来了,提一提还是又上去了..... 虽然我们不能预测中国房价什么时候崩盘,但是却可以用机器学

【火炉炼AI】机器学习019-项目案例:使用SVM回归器估算交通流量

[火炉炼AI]机器学习019-项目案例:使用SVM回归器估算交通流量 (本文所使用的Python库和版本号: Python 3.5, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2 ) 我们都知道,SVM是一个很好地分类器,不仅适用于线性分类模型,而且还适用于非线性模型,但是,在另一方面,SVM不仅可以用于解决分类问题,还可以用于解决回归问题. 本项目打算使用SVM回归器来估算交通流量,所使用的方法和过程与我的上一篇文章[火炉炼AI]机器学习018-项

【火炉炼AI】机器学习017-使用GridSearch搜索最佳参数组合

[火炉炼AI]机器学习017-使用GridSearch搜索最佳参数组合 (本文所使用的Python库和版本号: Python 3.5, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2 ) 在前面的文章([火炉炼AI]机器学习012-用随机森林构建汽车评估模型及模型的优化提升方法),我们使用了验证曲线来优化模型的超参数,但是使用验证曲线难以同时优化多个参数的取值,只能一个参数一个参数的优化,从而获取每个参数的最优值,但是有时候,一个非常优秀的模型,可能A

【火炉炼AI】机器学习018-项目案例:根据大楼进出人数预测是否举办活动

[火炉炼AI]机器学习018-项目案例:根据大楼进出人数预测是否举办活动 (本文所使用的Python库和版本号: Python 3.5, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2 ) 我们经常看到办公大楼中人来人往,进进出出,在平时没有什么活动的时候,进出大楼的人数会非常少,而一旦举办有大型商业活动,则人山人海,熙熙攘攘,所以很明显,大楼进出的人数和大楼是否举办活动有很明显的关联,那么,是否可以构建一个模型,通过大楼进出人数来预测该大楼是否在举办

【火炉炼AI】机器学习042-NLP文本的主题建模

[火炉炼AI]机器学习042-NLP文本的主题建模 (本文所使用的Python库和版本号: Python 3.6, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2, NLTK 3.3) 文本的主题建模时用NLP来识别文本文档中隐藏的某种模式的过程,可以发现该文档的隐藏主题,以便对文档进行分析.主题建模的实现过程是,识别出某文本文档中最有意义,最能表征主题的词来实现主题分类,即寻找文本文档中的关键词,通过关键词就可以识别出某文档的隐藏主题. 1. 准备数

【火炉炼AI】深度学习005-简单几行Keras代码解决二分类问题

[火炉炼AI]深度学习005-简单几行Keras代码解决二分类问题 (本文所使用的Python库和版本号: Python 3.6, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2, Keras 2.1.6, Tensorflow 1.9.0) 很多文章和教材都是用MNIST数据集作为深度学习届的"Hello World"程序,但是这个数据集有一个很大的特点:它是一个典型的多分类问题(一共有10个分类),在我们刚刚开始接触深度学习时,我倒是觉得