Canny 边缘提取相关知识学习,图像处理第 32 篇博客
Python OpenCV 365 天学习计划,与橡皮擦一起进入图像领域吧。本篇博客是这个系列的第 32 篇。
基础知识铺垫
<kbd>Canny</kbd>边缘提取的目标是找到一个最优的边缘检测算法,从这里能看出,目标依旧是提取边缘。
它的原理是:检测出图像中所有灰度值变化较大的点,这些点进行连接形成线条,线条的集合就是图像的边缘。
该边缘检测比较流行,我们进行一下学习吧。
在这里依旧补充一下图像里面什么是边缘:
直观上图像的边缘是灰度值突然改变的地方,边缘产生有以下几个原因:
表面法向量不连续(新知识,法向量:垂直于平面的直线所表示的向量为该平面的法向量);
深度的不连续;
表面颜色的不连续;
光照的不连续。
好的边缘提取器的标准
该标准适用于检测所有边缘提取算法
<kbd>Good detection</kbd>:既不能过多的检测出噪声,也不能丢失边缘信息;
<kbd>Good localization</kbd>:边缘应该尽可能和真实图像边缘接近;
<kbd>Single response</kbd>:边缘提取的尽可能细,每个只占一个像素点。
Canny 边缘检测的相关说明
首先看一下网上对其步骤的说明:
图像降噪,使用高斯滤波器,消除噪声,使用
GaussianBlur
函数;计算图像梯度,每个像素的梯度和方向都要计算,使用
Sobel
与Scharr
函数;非极大值抑制,消除边缘检测带来的杂散响应(新名词);
阈值筛选,高低阈值输出二值图像。
Canny 函数原型
参数说明如下:
<kbd>image</kbd>:输入图像;
<kbd>threshold1</kbd>:低阈值;
<kbd>threshold2</kbd>:高阈值;
<kbd>edges</kbd>:这个参数就比较迷了,输出的边缘图(为何不用 dst);
<kbd>apertureSize</kbd>:算子大小,默认值为 3;
<kbd>L2gradient</kbd>:计算图像梯度的方式。
官方参数说明可以点击学习
测试代码如下:
运行之后,可以发现图像边缘提取的还可以。
高低阈值筛选如果 low
,high
为阈值,那高于 high
的都保留,小于 low
的都丢弃,最终即可输出二值图像,推荐高低阈值比例为 1:3
或者 1:2
。
上面代码还遗留一个小问题,即使用灰度图像,如果读取进来的图片没有进行该转换,最终得到的效果会有差异,效果图如下:
官方手册相关知识可以点击
加入滑动条
对于这种涉及值的操作,都可以使用滑动条解决问题。
修改成动态调参代码与效果如下:
相关数学知识挖坑
本部分用于记录本文中提及的相关数学原理,后续逐步埋坑。
x 轴与 y 轴方向上的一阶偏导数;
反三角函数;
高斯滤波器公式;
法向量。
橡皮擦的小节
希望今天的 1 个小时(今天内容有点多,不一定可以看完),你有所收获,我们下篇博客见~
版权声明: 本文为 InfoQ 作者【梦想橡皮擦】的原创文章。
原文链接:【http://xie.infoq.cn/article/6c56d36eff240a817842d9067】。文章转载请联系作者。
评论