c#用canny算子做边缘提取_【图像处理】边缘检测
边缘检测
sobel
sobel是最常见也是最常用的边缘检测算子。一般来说,当我们想要获取图像的边缘时,首先想到的就是像素值发生突变的位置,而如何用数学表达来刻画"突变",一个很好的方式就是使用导数,而在图像中,由于像素是离散的,我们一般使用差分来近似处理,使用某种算子来近似计算全图每一点的梯度值,其中梯度明显大于邻近像素的点就被认为是边缘(实际处理中,使用大于某一阈值作为评判标准)。
sobel算子就是实现上述算法的一种基本算子,其一般分为水平和垂直两个方向的计算,两个方向上的算子互为转置。在两个方向分别计算完成之后,取其绝对值的和或平方和的算术平方根(1,2范数),即得到最终的梯度结果。(一般来说在硬件上计算绝对值要比平方开方廉价很多,所以一般使用绝对值较多)
此外,当滤波器大小为3的时候,sobel算子的近似将会带来明显的准确度下降,这时可以使用相同计算量但更为精确的Scharr算子,其近似计算更加精确。
具体的效果对比图如下:(左原图,中sobel,右scharr)
图中可以看到在scharr对于头发,嘴唇,皮肤纹理等细节的梯度信息提取的更好。
laplace
sobel及scharr是基于一阶导数,选取一阶导数的较大部分(例如极大值),那么自然,二阶导数也成为了一个可用的评判指标,即用二阶导数等于0来作为判断是否为边缘。当然由于导数等于0只是一个取极值的必要条件,所以不仅仅是边缘的二阶导数才为0,某些无意义(例如图像的平坦区域,一阶导数,二阶导数都是0)的点也会存在,在实际处理中一般是添加滤波器来处理(比如检测像素左右两个像素差的绝对值大于阈值)。
在实际图像处理中,一般使用laplace算子的差分近似,故得到常用模板如下:
此外,sobel算子具有明确的方向性(垂直和水平),将图像旋转某一角度,其提取效果就会下降,但是laplace算子却是具有旋转不变性的,这一点可从其模板中心对称性,或者从原始公式证明得到(令
还有,由于laplace算子使用了二阶导数,所以其相比sobel这种一阶方法对噪声更敏感,其受噪声的影响更明显(想象一下一条平滑的函数图像上出现了很多锯齿段,这样自然会错误地发现更多虚假的极值点)。
canny
canny算子是一种更系统性的边缘检测算子,其使用sobel算子作为检测器的补一份,同时首先使用gauss滤波器减弱噪声的影响,提取出边缘之后再用NMS(非极大值抑制)和阈值筛选来减少虚假边缘,这里我主要涉及其中的非极大值抑制部分。
在目标检测任务中对检测框NMS已经是一个家喻户晓的基本操作,但其实这是图像处理算法中的常用技巧。canny中的非极大值抑制,即要在sobel提取出的梯度图中找到梯度的局部最大值,并将非极大值置为0,从而减少虚检。而canny中的NMS是指是否为梯度方向上的极大值,不像角点检测等场景下是其邻域中的最大值。具体的算法步骤如下:
- 对sobel提取的垂直和水平方向的结果使用反正切的近似获得梯度方向
- 根据梯度方向在滤波器范围内找到两个邻近的亚像素点(sub-pixel)
- 使用双线性插值获得这两个亚像素点的梯度估计值
- 将两个估计值和当前点的梯度相比较,若不是极大值,则置为0,否则保持不变
噪声影响下的边缘检测
高斯白噪声:
高斯白噪声(AWGN),简单来说就均值为0,方差为
高斯-泊松噪声
高斯-泊松噪声,将噪声的来源分为两部分,一部分是光子到达sensor时,即拍照时产生的噪声(shot noise),shot noise可近似看作一个Poisson随机变量,其均值是真实的的光子强度。另一部分是从电路中读取像素值时产生的噪声(read noise),它可以近似看作一个均值为0,方差为定值的Gaussian随机变量。
在具体实现时,一般使用如下的近似策略
- 将其近似看作一个信号相关(signal-dependent)的高斯分布,即满足如下公式:
其中x是真实值,noise是噪声,y是加了噪声之后的值
椒盐噪声
椒盐噪声(Pepper and Salt Noise),即随机出现的hot point和dead point,即某个点的像素值为最大值(hot point)或最小值(dead point),在实际图像设备中一般是由于sensor和传输中的干扰和错误产生,使得像素值达到上限或下限。
实验效果
添加噪声的后图片如下:(从上到下依次为:原图,高斯,高斯-泊松,椒盐)
三种算子在添加噪声后的效果如下:(三种边缘检测从左往右依次是sobel,laplace,canny)
- 从图中可以看到sobel和laplace对噪声的敏感性,天空部分在高斯-泊松噪声和椒盐噪声的情形下,会错误保留大量的噪声,致使整个梯度图天空部分非常杂乱,而canny由于NMS和阈值抑制就会相对干净很多。sobel的鲁棒性要强于laplace,可以看到草地上sobel还是可以发现部分主干纹理,而laplace已基本和噪声混为一体。
- 对于孤立点,可以看到由于算子模板的不同,sobel倾向于将其提取为"口"字状的小方块,而laplace倾向于提取为中心放射状的点。
- 同时,对于纹理复杂的图像,可以发现噪声对于边缘提取算法的影响十分严重,对比草地细节可以发现提取到的纹理变化较多,只是由于纹理过于密集所以远观感觉差异不大。
(注:此处所有边缘检测算法都在检测之前做了高斯滤波,一定程度上减弱噪声)
- 对于较为简洁,图像复杂纹理不多的图像,canny对于噪声的抵御能力明显较强,可以看到三种噪声带来的影响都不是很大,而sobel和laplace在高斯-泊松噪声和椒盐噪声下仍然会有严重的问题。
- 对于虚化部分,如该图中的背景部分,虽然人眼仍然能看到一些物体边缘,但是由于虚化之后像素变化幅度愈加小,致使大部分梯度值无法超过提取算法的阈值,故没有呈现在结果图中。
- 人像图片的细节纹理,由于本身像素值变化幅度较小,加上磨皮等人像处理算法的作用,一般很难直接应用边缘检测算法提取出好的结果。
- 对于人像,canny提取出来的边缘可视感比sobel和laplace要差,尤其是图中的右眼部分,其更倾向于边缘本身而不是保留原图观感。
- 第三行第2,3列这量张图很有意思,可以看到在这种噪声情形下人脸的轮廓,部分头发和嘴唇细节也都有一定程度的响应。猜想适当的噪声辅助可以提高某些情况下的边缘检测效果,人眼可视感明显加强,这类似于人像图像处理流程最后一定要适当放回部分噪声,从而增强人像整体的可视感。(不过机器视觉可能并不认为这样观感好)
模糊影响下的边缘检测
线性运动模糊和非线性运动模糊
这里我使用传统方法来生成模糊图像,即使用运动模糊核和原图做卷积运算,得到模糊后的结果,具体操作中使用了下列两种模糊核,分别用来近似线性和非线性。
线性核:
非线性核:
高斯模糊
即在图片进行边缘检测之前再使用一个更大的(kernel_size=7)的高斯核进一步磨平图像。
实验效果
从上到下依次是原图,线性模糊,非线性模糊,高斯模糊
- 运动模糊对于边缘检测的影响非常严重,对于线性运动模糊,几乎只有和运动方向相同的梯度可以检测出,而对于非线性运动模糊,图像模糊程度进一步加强,sobel由于算子的方向性,检测效果下降很多,canny由于其复杂的抑制机制直接检测不出任何边缘,laplace虽然有响应,但是检测到的也是杂乱无章的效果,类似图片旋转多次后的梯度叠加(天空和树尤为明显)。而换个角度考虑,canny可以作为运动模糊的检测器。
- 高斯模糊则更接近一种磨平的效果,草地纹理减少了很多,碉堡上的圆孔也消失不见,但是部分过于杂乱的纹理也变的清晰一些。所以,适当的高斯模糊可以有效压制噪声,并简化细节纹理,但是过强的则会丢失信息。
- 运动模糊本质上是一种积分操作,即可以简单视作原图和运动生成图的叠加,简化后,对运动模糊后的图提取梯度可以看作原图和生成图的梯度叠加,这其中会有正负梯度的叠加导致信息减弱或消失,这从另一个方面解释了为什么模糊后的图像边缘提取效果会严重下降。
- 高斯模糊下,canny左半部花的轮廓丢失,而sobel和laplace仍然可以看出轮廓。
- 孤立点,单个响应点,例如原图中的白点,在高斯blur之后,canny由于其复杂的抑制处理,对其的提取能力会大大下降,其与周围像素点的像素差被减弱,故无法通过阈值,而laplace仍可以保持一定的响应。故laplace对于孤立点的检测效果更加robust。
边缘检测与锐化
暴力加边缘
边缘检测算法的另一用途就是图像锐化,人眼对于边缘,细节纹理等高频区域更加敏感,所以图像处理中也因此要对其进行增强。一个最直观的方法即将提取到的边缘直接加到原图上,从而达到增强效果。而由于laplace算子对于细节纹理信息的效果更好,所以锐化时一般使用laplace来提取高频信息。
USM(unsharpened mask)
暴力加边缘只是一种很初级的锐化算法。在各种图像编辑中更加常用的是USM。USM的核心是去间接获取高频信息,具体的算法流程如下:
- 使用高斯滤波器提取低频成分,并用原图-低频成分间接得到高频成分diff
- 对原图做对比度(constrast)处理得到增强图
- 以diff为判断依据,并结合事先确定好的阈值进行判断,小于阈值的点保留原图像素值,大于阈值的点通过公式$I = (1-r)O+rC$ 线性插值获得,其中r是增益系数,O是原图,C是增强图。
实验效果
从左到右依次是原图,暴力加,USM
USM总的效果还是更好一些,不过USM的高斯滤波器参数设置需要调节,默认设置会产生明显的artifact。
c#用canny算子做边缘提取_【图像处理】边缘检测相关推荐
- c#用canny算子做边缘提取_干货 | 边缘检测
最近小可爱们有没有等我们的技术推等到望穿秋水啊?大家日思夜想的技术推来啦.今天我们来一起学习一下opencv里面一个重要方面:边缘检测. 01.什么是边缘检测 边缘检测是图像处理和计算机视觉中的基本问 ...
- c#用canny算子做边缘提取_机器视觉学习(三)边缘检测
一.边缘检测 二.边缘检测流程 三.Canny边缘检测 前言 边缘检测是图像处理和计算机视觉中,尤其是特征提取中的一个研究领域.有许多方法用于边缘检测,它们的绝大部分可以划分为两类: 基于一阶导数 首 ...
- canny算子的边缘提取算法
canny算子边缘提取分为四个步骤 1.去噪: 利用高斯滤波对图像卷积进行去噪处理: 2.求梯度: 采用梯度滤波模板对图像进行卷积,求取图像X方向和Y方向的梯度,以及对应的夹角: 3.非极大值抑制: ...
- Halcon边缘检测Sobel、Laplace和Canny算子
提示:文章参考了网络上其他作者的文章,以及相关书籍,如有侵权,请联系作者. 文章目录 前言 一.像素级边缘提取 1.经典的边缘检测算子 2.边缘检测的一般流程 3.sobel_amp 算子 参考文献 ...
- MATLAB中canny算子边缘检测
今天来介绍一下关于canny算子做边缘检测的过程: Canny的目标是找到一个最优的边缘检测算法,最优边缘检测的含义是: 好的检测- 算法能够尽可能多地标识出图像中的实际边缘. 好的定位- 标识出的边 ...
- caany边缘检测matlab,自适应canny算法研究及其在图像边缘检测中的应用.pdf
自适应canny算法研究及其在图像边缘检测中的应用.pdf 还剩 51页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,很抱歉,此页已超出免费预览范围啦! 如果喜欢就下载吧,价低环保! 内容 ...
- 数字图像处理---LOG算子和CANNY算子边缘提取(matlab)
LOG算子和CANNY算子边缘提取 边缘的含义: 在数字图像中,边缘是指图像局部变化最显著的部分,边缘主要存在于目标与目标,目标与背景之间,是图像局部特性的不连续性,如灰度的突变.纹理结构的突变.颜色 ...
- c++gdal如何在大图像中截取小图像并获取其图像信息_【图像处理】OpenCV系列十 --- 边缘检测之Canny算子...
上一篇我们学习了图像处理形态学相关知识点,相信大家学习之后已经对形态学有了足够的理解了,那么接下来,我们一起来学习一下图像处理中的边缘检测吧!我们将会重点学习边缘检测各种算子和滤波器 --- Cann ...
- 【图像处理】——Python图像分割边缘检测算法之一阶梯度算子(Roberts、Prewitt、Sobel、 Kirsch、Canny算子)
目录 前言 一.边缘检测算法 1.一阶算子 2.二阶算子 二.一阶算子 原图像lena 1.Roberts算子 不同方向的算子模板 梯度的计算 系统代码: 自定义函数代码 结果 2.Prewitt 不 ...
最新文章
- pfSense设置多WAN后,解决网银无法登陆问题
- 资源 | 深度学习图像标注工具汇总
- 干货 | OpenCV中KLT光流跟踪原理详解与代码演示
- java中的反射(一)
- 计算机与自动化专业有哪些学校,全国自动化专业大学排名
- 【转载】基于Redis实现分布式锁
- SSL的作用与目前主流的使用场景介绍
- webuploader上传多张照片的基本功能
- HTML5 学习准备
- 推挽与开漏输出详解(转)
- 域名转换为IP地址示例
- die、exit()和return区别
- 当房地产插上数字翅膀后,成本收益几何?|2021中国房地产数字峰会
- Html5 获取手机短信号码
- 瑞吉外卖-2022微信小程序点餐项目
- (转载)Java反射机制
- iOS开发之SDK开发
- 【网络技术】(5)身份认证技术与访问控制------数字签名技术
- 应用性能测试关注点(来自听云)
- 一阶低通滤波器的传递函数分析
热门文章
- SAP Spartacus shipping address页面请求2.1 - setDefaultAddress
- SAP Spartacus storefrontapp不是运行在简单的tomcat服务器上
- 一个简单的Angular search UI实现
- 如何查询当前SAP用户所属的组织单元(organization unit)
- 使用SAP portal service创建Fiori Launchpad
- when is extension component's resource bundle loaded
- Tomcat和Eclipse不同的集成方式
- Marketing Cloud里CSRF token的获取时机
- why Material request downlaod get an empty BDOC in SMW01 - structure MGV_TLMNR
- UI framework 处理user 错误输入的逻辑