python边缘检测函数 python 边缘计算

3种python3的canny边缘检测之静态,可调节和自适应先看高级版的python3的canny的自适应边缘检测:
内容:
1 canny的边缘检测的介绍 。
2 三种方法的canny的边缘检测,由浅入深地介绍:固定值的静态,可自调节的,自适应的 。
说明:
1 环境:python3.8、opencv4.5.3和matplotlib3.4.3 。
2 图片:来自品阅网正版免费图库 。
3 实现自适应阈值的canny边缘检测的参考代码和文章:
上述的代码,本机均有报错,故对代码进行修改,注释和运行 。
初级canny:
1 介绍:opencv中给出python边缘检测函数了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篇文章 , 虽然python边缘检测函数我进行代码的删除,注释,修改,优化等操作,故python边缘检测函数我不标注原创,对原作者表达敬意 。
4 自己总结和整理,分享出来,希望对大家有帮助 。
python库skimage 实现canny边缘探测 请参考: Canny算法python手动实现
请参考: Canny边缘检测算法原理及opencv实现
skimage.feature.canny(image, sigma=1.0, low_threshold=None, high_threshold=None, mask=None, use_quantiles=False)
sigma:高斯滤波器的标准差
low_threshold:Canny算法最后一步中,小于该阈值的像素直接置为0
【python边缘检测函数 python 边缘计算】high_threshold:Canny算法最后一步中,大于该阈值的像素直接置为255
如何理解这段python程序convolve 这个函数应该是 输入的numpy.array,按照权值weight,
以(i,j)点的邻域 行列式(i:i w,j j h)和行列式wight进行 行列式相乘 得到的结果为新的(i , j)
说白了就是权值的相加减的问题,梯度不剃度我就不知了额
边缘检测之孤立点检测及Python实现 边缘即指图像中连接在一起python边缘检测函数的像素值发生突变python边缘检测函数的像素点的集合python边缘检测函数,故边缘检测则为检测出图像中所有的边缘
根据边缘像素的像素值突变的特性,可以想象到 导数 是一种即为有效的手段 。而在图像中的像素值是离散的值,故在实际边缘检测算法中采用 差分 来近似导数 。
即 一阶导数
而对于 二阶导数
又根据一阶导数的差分公式可得
而对于上式,可知其为关于的差分 , 故可得到关于的差分
综上可知
在图像中,灰度值的变化是双向的——轴与轴 。换句话说,在检测边缘像素点时,需要考虑到两个方向的梯度 。而拉普拉斯算子在二维空间的表达式为
即为两个方向上的二阶导数之和 , 而二阶导数相对于一阶导数对于像素点的变化更为敏感 , 则应用拉普拉斯算子可十分有效的检测到孤立点 。当然 , 也正因为拉普拉斯算子对于变化十分敏感,噪声对其的影响较大 。
根据1.2中二阶导数的推导式,可得拉普拉斯算子如下
在点计算的拉普拉斯算子的绝对值大于指定的阈值时(即该点的像素值变化明显),则认为该点为边缘点python边缘检测函数;对于输出图像中该位置为亮点 。否则,为暗点 。表达式如下
在计算图像中的一阶导数与二阶导数时,空间滤波器是常用计算方法 。计算过程为模板系数与在计算点处模板所对应的像素点的灰度值的乘积之和 。当模板系数之和为时,表示对于恒定灰度区域计算的模板想要为。
空间滤波器模板
对应灰度值
两个矩阵元素对应相乘相加则为拉普拉斯算子
click me!
图像分析:边缘检测中的梯度算子边缘检测 是基于边界的图像分割方法的第一步,边缘就是两个不同的相邻区域之间 灰度值 不连续或者突变的地方 。因此,检测边缘就是,检测灰度明显变化的地方 。而边缘位置处灰度的明显变化是可以借助计算灰度的微分来检测的 。一般使用一阶微分和二阶微分检测边缘 , 在边缘位置 , 一阶微分的幅度值会有局部极值 , 二阶微分的幅度值会出现过零点 。本文主要介绍边缘检测中的一阶微分算子----梯度算子,包括Roberts、Prewitt和Sobel三种算子 。
想要计算梯度图,就要设计模板卷积,首先要搞明白图像在计算时的坐标系,很多博文对应的模板和坐标系都不匹配,我们在后面的卷积操作中主要使用计算坐标系 。
左图Cameraman所用的坐标系统,常用在图像计算中 。其坐标原点在左上角,x轴是水平的,并且向右延伸;y是垂直的,并且向下延伸 。既可以代表这幅图像,也可以表示坐标处像素的值 。
右图Lena的坐标系统,常用在屏幕显示中,因为屏幕扫描是从左向右,从上向下进行的,原点在图像的左上角,纵轴标记图像的行,横轴标记图像的列 。既可以代表这个图像,也可以代表行列交点处的图像值 。
首先我们要知道的是梯度是一个向量,向量的话有方向和大小,梯度方向指向函数变化最快的方向,大小就是它的模,也是最大的变化率 。对于二元函数,它在点的梯度就是, 或者 , 就是:
其中 , , 这个梯度向量的幅度和方向角为
下图展示了一个灰度图的数学化表达,像素点的灰度值是,它有八个邻域 。
图像在点的梯度为
其中
即对应图像的水平方向,即对应水图像的竖直方向 。
要理解梯度图的生成,就要先了解模板卷积的过程 。
模板卷积是模板运算的一种方式,其步骤如下:
(1)将模板在输入图像中漫游,并将模板中心与图像中某个像素位置重合;
(2)将模板上各个系数与模板下各对应像素的灰度相乘;
(3)将所有乘积相加(为保持灰度范围,常将结果再除以模板系数之和,后面梯度算子模板和为0的话就不需要除了);
(4)将上述运算结果(模板的响应输出)赋给输出图像中对应模板中心位置的像素 。
其实梯度图生成前面和模板卷积相同 , 不同的是要生成梯度图,还需要在模板卷积完成后计算在点梯度的幅值,将幅值作为像素值,这样才算完 。。
下图是生成梯度图用到的的水平模板和竖直模板:
例如,如果只想生成水平方向的梯度图,那么只计算水平方向的梯度,则梯度图上对应点的灰度值就是
一般是水平方向的和竖直方向的各用一个模板,然后结合,那么得到梯度图在点的灰度值就是
它就是我们上面说到的梯度的幅值,是以计算以2为范数,对应欧式距离 , 由于涉及平方和开方运算,计算量比较大 。(怎么简化计算呢??换一种近似计算方式吧?。。。?
在真实的梯度图输出计算中,采用以1为范数(对应城区距离)的简单计算方式,即
另一种简单的方式是以为范数(对应棋盘距离),即
首先了解下梯度算子的设计 , 一般是水平方向和竖直方向,水平方向模板转置再对折就是竖直方向 。
其本质是一个对角线方向的梯度算子,对应的水平方向和竖直方向的梯度分别为
输出梯度图在的灰度值为
优点:边缘定位较准
缺点:(1)没有描述水平和竖直方向的灰度变化,只关注了对角线方向,容易造成遗漏 。(2)鲁棒性差 。由于点本身参加了梯度计算,不能有效的抑制噪声的干扰 。
适用于边缘明显且噪声较少的图像 。
Prewitt算子是典型的模板,其模板中心对应要求梯度的原图像坐标,对应的8-邻域的像素灰度值如下表所示:
通过Prewitt算子的水平模板卷积后,对应的水平方向梯度为
通过Prewitt算子的竖直模板卷积后,对应的竖直方向梯度为
输出梯度图在的灰度值为
Prewitt算子引入了类似局部平均的运算,对噪声具有平滑作用,较Roberts算子更能抑制噪声 。
通过Prewitt算子的水平模板卷积后,对应的水平方向梯度为
通过Prewitt算子的竖直模板卷积后,对应的竖直方向梯度为
输出梯度图在的灰度值为
Sobel算子引入了类似局部加权平均的运算,对边缘的定位比要比Prewitt算子好 。
Python 调用OpenCV接口实现Sobel算子边缘检测
关于python边缘检测函数和python 边缘计算的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站 。

    推荐阅读