计算机视觉CS131:专题3

您所在的位置:网站首页 x=-根号y图像 计算机视觉CS131:专题3

计算机视觉CS131:专题3

#计算机视觉CS131:专题3| 来源: 网络整理| 查看: 265

1 前言

为什么要研究边缘检测?

答:直观地说,图像中的大多数语义和形状信息都可以用‘边缘’来体现。(更深层的生理原因是哺乳动物的大脑神经元对边缘信息非常敏感)

形成图像边缘常见的一些原因:

表面形状的突变背景深度的不连续颜色的突变光线阴影的不连续2 图像梯度2.1 梯度回顾

梯度:表示函数在某一点的变化率最大的方向和变化率的大小。在物理学中,梯度有着重要的物理意义,可以用来描述物理量在空间中的变化和分布情况。

数学上梯度公式的离散形式如下:

{\frac{d f}{d x}}{=}\operatorname*{lim}_{\Delta x\to0}{\frac{f(x)-f(x-\Delta x)}{\Delta x}}=f^{\prime}(x) \\

对于图像来说,图像的边缘部分,是像素值变化剧烈的地方,对图像所有像素值位置求梯度,就能知道图像中哪些位置是边缘

因为图像的尺寸是离散的,比如1920*1080像素,临近位置的最小距离单位就是1像素,所以,上述梯度公式中 \Delta x\to0 取极限也就是 \Delta x = 1,梯度公式就可以简化为:

{\frac{d f}{d x}}=\;{\frac{f(x)-f(x-1)}{1}}=f^{\prime}(x) \\ {\frac{d f}{d x}}=\ f(x)-f(x-1)=f^{\prime}(x) \\

备注:上述f(x)代表图像上某位置的像素值,f(x-1)代表它的某临近像素点的像素值,f'(x)就是该位置的图像梯度值。

综上,从公式可以看出,图像某位置的梯度,就是该位置像素点和它自身临近像素点的像素值之差。

特别注意:这里对 f(x) 也可以用上下左右临近的8个像素点差值来表示,对 f(x) 不同的看待方法,就产生了OpenCV中不同的图像梯度计算算子,后面会介绍它们。

2.2 图像梯度的表示

边缘是图像强度函数中变化迅速的地方,边缘可以用梯度值表示,如下:

上图左边是原图,中间图是左图红线部分每一个像素点的像素值(纯白色是255值,纯黑色是0值),右边图是对中间图的求导结果。

通常情况下,图像的梯度我们表示如下:

梯度向量(梯度是有方向的)指向图像强度增长最快的方向:

梯度的方向计算公式为(角度值相对于x轴方向):

梯度的模长(幅值)——数学意义是此处梯度变化的大小,物理意义是为图像边缘的强度或可能性:

2.3 图像梯度的最简单计算方法

我们要获得X方向梯度图,本质上就是让梯度图中每个位置的像素点值代表原图中相应位置的左右两个像素值之差。这刚好直接把原图跟[-1, 0, 1]行向量进行卷积就能得到!!!

回顾一下高斯核:

如下是对一个高斯核图像进行X方向求导的示意图:

几点注意:

关于梯度图中元素值:上图中3D高斯核的‘水平面’代表2D高斯核图中像素0值,高于水平面的是正数(图像的灰度值本身就是全为正),但是得到的求导图像,开始出现负值。关于翻转180度(卷积计算是要先对核翻转180度):是跟[-1, 0, 1]卷积还是[1, 0, -1]卷积,没有本质区别,虽然结果区域的正负号会变化,但只要事先统一确认方向,最终判定边缘或搞其他操作,正负号并不产生影响。求Y方向梯度图像同理,而要求梯度的模,只要求X和Y的平方和再开根号就能得到。以下是对高斯核X和Y方向求梯度的结果图:

对一般的图像求导结果的可视化如下:(同样注意:下图灰度值大小并不代表具体的求导值结果,梯度值中也有负数)

2.4 直接通过计算梯度找图像边缘存在的问题

如果像下面这样的‘简单干净’图像,可以直接用图像梯度找到边缘:

但是大多情况下,图像是有各种噪声的,比如:

当图像的像素存在大量噪点时,相邻的像素差异大,所求梯度也会偏大,无法提取边缘信息:(注意:之前我们讲的图像梯度是仅计算相邻两个像素点灰度值变化幅度,所以只要图像模糊或有噪声等,图像中任何位置都可能梯度变化成随机值)

解决方案

先平滑处理:使用平滑滤波器去噪,使图像信号变得平滑。然后再对平滑后的信号求导,取极值。

过程和理论效果如下

上述方案降低计算量的方法:

根据卷积的计算性质有:

{\frac{d}{d x}}(f*g)=f*{\frac{d}{d x}}g \\ 我们可以先对平滑核求导,再进行卷积相乘,从而减少计算量,如下:

不同σ值高斯核对图像平滑去噪后,再对图像求导的结果如下:

2 边缘检测算子

好的边缘检测器应具备的要素:

精度要好:把假阳性(误检)、假阴性(漏检)检测概率搞得尽量低。位置要准:检测到的边缘位置要和原图一致。连续+尽量窄:如下图最左边是好的边缘返回结果,右边3个是不同类型较差的边缘检测结果。

关于算子和算法:

算子和算法都是计算机科学领域的重要概念,但它们有着不同的含义。

算子:是指一种特定的数学运算符号或者程序中的某个操作符号。算子通常被用于表示基本的数学和逻辑运算,是程序中的基础组成部分。算法:则是一种解决问题的步骤和方法。通常,算法由一系列操作和决策步骤组成,这些步骤指定了如何使用给定的输入数据来产生期望的输出。算子相当于算法的一个组成部分。

opencv中集成了很多边缘检测算子,本质上就是不同形态的卷积核,有几个点先提示一下:

很多算子的核宽可以指定和变化。彩色图相当于3种灰度图的叠加,彩色图求梯度需要先转成一个灰度图。转灰度图主要有两种方法:方法1:Gray=(R+G+B)/3;方法2:Gray=0.299R+0.587G+0.114B;(这种参数考虑到了人眼的生理特点)图像梯度对噪音非常敏感,需要先对图像进行平滑,然后求梯度。通常滤波和边缘检测是矛盾的概念,抑制了噪声会使得图像边缘模糊,这会增加边缘定位的不确定性;实际工程经验表明,使用高斯核函数可以在抗噪声干扰和边缘检测精确定位之间提供较好的折衷方案。使用opencv的梯度算子,实际上要取个阈值,梯度图元素的绝对值超过阈值的部分视为边缘。低于阈值的像素点用0值表示,表示此处没边缘,不为0的像素点,灰度值越高表面此处边缘强度越大。

下面开始介绍常见的边缘检测算子。

2.1 Prewitt(普鲁伊特)算子

卷积核长这样:

其利用像素点上下、左右邻点的灰度差。这种判定是欠合理的,会造成边缘点的误判,因为许多噪声点的灰度值也很大,而且对于幅值较小的边缘点,其边缘反而丢失了。

2.2 soble(索贝尔)算子(OpenCV中最常用)

卷积核长这样:

Sobel 算子在 Prewitt 算子的基础上增加了权重的概念,认为相邻点的距离远近对当前像素点的影响是不同的,距离越近的像素点对应当前像素的影响越大,从而实现图像锐化并突出边缘轮廓。

2.3 Laplacian(拉普拉斯)算子

四领域模板核长这样:

八领域模板核长这样:

2.4 Roberts罗伯特交叉算子

卷积核长这样:

这网上普遍说是最简单的算子,而且最先介绍。元素值是少并简单,但理解感觉是最难的,而且用的很少,所以我放在最后介绍。

这是Roberts于1963年提出的交叉算子边缘检测方法。该方法最大优点是计算量小,速度快。但该方法由于是采用偶数模板,如下图所示,所求的(x,y)点处梯度幅度值,其实是图中交叉点处的值,从而导致在图像(x,y)点所求的梯度幅度值偏移了半个像素(见下图)。

2.5 四种算子的总结

1)Robert算子对陡峭的低噪声图像效果较好,尤其是边缘正负45度较多的图像,但定位准确率较差;

2)Prewitt算子对灰度渐变的图像边缘提取效果较好,而没有考虑相邻点的距离远近对当前像素点的影响;

3)Sobel算子考虑了综合因素,对噪声较多的图像处理效果更好。

4)Laplacian算子对噪声比较敏感,由于其算法可能会出现双像素边界,常用来判断边缘像素位于图像的明区或暗区,很少用于边缘检测;

3 Canny边缘检测算法

该算法诞生于1986年,这可能是计算机视觉中应用最广泛的边缘检测器,着重讲一讲。

3.1 常规边缘检测算法的2个问题

问题1:边缘很粗

在如sobel这样的边缘检测算子,对图像求梯度图后,会设置一个阈值,绝对值超过阈值的像素为视为边缘,这就导致得到的边缘图中‘边缘’会很粗。

问题2:渐变边低于阈值

由于sobel中梯度阈值是全局性的,不能太高也不能太低,这就导致很多不明显的渐变边被擦除。

3.2 canny算法的原理

该算法整个过程如下:

对原始图像进行灰度化对图像进行平滑(高斯滤波)求图像平滑后的梯度图、以及梯度方向图NMS非极大值抑制筛选双阈值+连通与否筛选

第1,2,3步

1~3步理解简单,但工程上具体实现时其实是这样的:先对高斯核求导,然后求导后的高斯核对原灰度图进行卷积操作。这样做的目的简化计算量,之前专题内容里有提到过原理。

假设对某图完成1,2,3步后结果如下:

第4步:NMS

为了解决梯度图中‘边缘’很粗问题,我们要利用非极大值抑制算法来找到沿着梯度方向的局部最大像素点,非局部最大像素点全部变为0,就像下面这种情况:

具体怎么实现上述非极大值抑制想法呢?思想和方法很简单,编程也不复杂,如下:

找沿着梯度方向线上的局部最大像素点:首先要明白,我们要找到并保留的是沿着梯度方向线上的局部最大像素点,而不是各方向局部最大像素点。因为,边缘线一般是连通的,不能只找上下左右梯度幅值最大的那个,这么找得到的边缘线就必定断裂了。判定方法——看C点像素值是否比dTmp1和dTmp2都大:上图C点是梯度图中某个像素点,它周围有8个临近像素点,还有一根C点位置梯度方向的可视化直线,这根直线在g1,g2像素点之间有个交点dTmp1,在g3,g4像素点之间有个交点dTmp2。虽然这两个交点的像素值本就不存在,但可以通过附近的两个像素点通过线性插值估算出来(这里也要用到梯度方向)。如果C像素点梯度幅值比那两个交点大,那么这个C点就保留,否则的话,这个像素点置为0。

使用NMS算法的效果如下:(边缘几乎都变成单像素宽度了,亮度强度代表梯度幅值大小即是边缘的强度)

上图放大观察后会发现,经过NMS后的梯度图,边缘宽度基本为1个像素宽度了,筛除了大量冗余的边缘像素点。

第5步:双阈值 + 连通区域分析

对梯度图每个像素都做上述这种筛选,就得到极大值抑制之后的新梯度图。走到这一步,如果直接设个梯度幅值阈值,也能直接得到没有‘粗’边缘的梯度图了,但是全图一刀切的梯度阈值肯定不好,一个好办法是设置两个阈值,一个高一个低,超过高标准阈值的梯度点视为‘确定边缘’,在高标准和低标准之间的视为‘待确认边缘’,低于低标准阈值的视为‘非边缘’。

其中‘待确认边缘’的进一步确认方法就是:看这个点是否在任何一个‘确定边缘’点所形成的连通区域线上,如果在则保留,不在则排除。

如上图,B位置的边缘线,它们没有跟任何一个超过maxVal阈值的点有连通,它们将全部排除。而C区域的一些梯度像素点因为和超过高阈值的梯度像素点有连通,所以这些梯度幅值虽然不大的边缘点,同样会被保留。

使用双阈值 + 连通区域分析单阈值的对比效果如下:

上图右下角就是canny算法处理的最终效果,比较好的解决了上面提到的两个问题。

3.3 高斯核对canny算法的影响

采用不同σ的高斯核,canny算法最终得到的效果会有较大变化,本质原因是高斯核的σ越大,则对图像平滑效果越明显,越是会把边缘给平滑掉。

所以,高斯核的σ越小,最终得到的边缘会越密集详细,反之,边缘会稀疏(仅保留非常明显的边缘)。根据这一特性,你可以根据需要,通过控制σ来让自己获取详略不同的边缘图。

3.4 OpenCV中canny算法的使用

canny的从零开始代码实现,网上也有,也可以问chatGPT,这里不介绍了。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3