先看高级版的python3的canny的自适应边缘检测:
内容:
1 canny的边缘检测的介绍。
2 三种方法的canny的边缘检测,由浅入深地介绍:固定值的静态,可自调节的,自适应的。
说明:
1 环境:python3.8、opencv4.5.3和matplotlib3.4.3。
2 图片:来自品阅网正版免费图库。
3 实现自适应阈值的canny边缘检测的参考代码和文章:
上述的代码,本机均有报错,故对代码进行修改,注释和运行。
初级canny:
1 介绍:opencv中给出了canny边缘检测的接口,直接调用:
即可得到边缘检测的结果ret,其中,t1,t2是需要人为设置的阈值。
2 python的opencv的一行代码即可实现边缘检测。
3 Canny函数及使用:
4 Canny边缘检测流程:
去噪 -->梯度 -->非极大值抑制 -->滞后阈值
5 代码:
6 操作和过程:
7 原图:
8 疑问:
ret = cv2.canny(img,t1,t2),其中,t1,t2是需要人为设置的阈值,一般人怎么知道具体数值是多少,才是最佳的呀?所以,这是它的缺点。
中级canny:
1 中级canny,就是可调节的阈值,找到最佳的canny边缘检测效果。
2 采用cv2.createTrackbar来调节阈值。
3 代码:
4 操作和效果:
5 原图:
高级canny:
1 自适应canny的算法:
ret = cv2.canny(img,t1,t2)
即算法在运行过程中能够自适应地找到较佳的分割阈值t1,t2。
2 文件结构:
3 main.py代码:
4 dog.py代码:
5 bilateralfilt.py代码:
6 原图:
7 效果图:本文第一个gif图,此处省略。
小结:
1 本文由浅入深,总结的很好,适合收藏。
2 对于理解python的opencv的canny的边缘检测,很有帮助。
3 本文高级版canny自适应的算法参考2篇文章,虽然我进行代码的删除,注释,修改,优化等操作,故我不标注原创,对原作者表达敬意。
4 自己总结和整理,分享出来,希望对大家有帮助。
边缘即指图像中连接在一起的像素值发生突变的像素点的集合,故边缘检测则为检测出图像中所有的边缘
根据边缘像素的像素值突变的特性,可以想象到 导数 是一种即为有效的手段。而在图像中的像素值是离散的值,故在实际边缘检测算法中采用 差分 来近似导数。
即 一阶导数
而对于 二阶导数
又根据一阶导数的差分公式可得
而对于上式,可知其为关于 的差分,故 可得到关于 的差分
综上可知
在图像中,灰度值的变化是双向的—— 轴与 轴。换句话说,在检测边缘像素点时,需要考虑到两个方向的梯度。而拉普拉斯算子在二维空间的表达式为
即为两个方向上的二阶导数之和,而二阶导数相对于一阶导数对于像素点的变化更为敏感,则应用拉普拉斯算子可十分有效的检测到孤立点。当然,也正因为拉普拉斯算子对于变化十分敏感,噪声对其的影响较大。
根据1.2中二阶导数的推导式,可得拉普拉斯算子如下
在点 计算的拉普拉斯算子的绝对值大于指定的阈值时(即该点的像素值变化明显),则认为该点为边缘点;对于输出图像中该位置为亮点。否则,为暗点。表达式如下
在计算图像中的一阶导数与二阶导数时,空间滤波器是常用计算方法。计算过程为模板系数与在计算点处模板所对应的像素点的灰度值的乘积之和。当模板系数之和为 时,表示对于恒定灰度区域计算的模板想要为 。
空间滤波器模板
对应灰度值
两个矩阵元素对应相乘相加则为拉普拉斯算子
click me!
Python可以使用计算机视觉算法来实现嘴唇分割。1、使用预处理技术降低图像噪声。
2、使用边缘检测算法来检测图像中的边缘。
3、使用形态学算法来分割出嘴唇的轮廓。