边缘检测综述

一.边缘检测综述

1.1基本概念介绍

开篇的一些废话……
其实,这里面介绍的整体还是比较基础、偏向新手入门的概念,不过本身自己也对这个领域了解的没多少,可能写的并不怎么样,但是对于自己而言,确实也花了不少时间,在写这个文档的过程中,因为有很多不明白的地方,倒逼着我去查一些资料。这里需要感谢很多人在网上分享的优质的博客,以及学长、老师的对我疑问的解答,也希望这之后这里的介绍能够帮一些新人入门,日后他人再查找时有一个垫脚石,同时,也可以作为自己的一个快速回顾,更多的是,在写的过程中,本身是有很多收获的。
除了最后的参考文献外,对我在canny算子的理解上有比较重要帮助的文章有OpenCV的官方文档;知乎上一个专栏数字图像处理:边缘检测,需要注意的是,这里的非极大值抑制讲的稍微有点问题,我在参考后已经更正。
谭升的博客也对我理解一下sobel算子的模板是怎么来的也提供了提供了一个新的角度,这里致谢!谭升的博客
阮一峰的博客对我理解图像与波的过程起了很大帮助!阮一峰:图像与波。这里也表示感谢!
还有一些学长也给我解释了一些问题,这里也要说声谢谢!

在最后再补充一下说明,这个本来是一个作业,要求是读一篇sci或者顶会论文。虽然说取其上者得其中,取其中者得其下,在最开始的时候,确实很多概念不懂,对于现在以及传统的方法具体是怎样的都不了解,最开始顶多知道如Matlab有个edge函数,Opencv也有现成的函数,但是这些是怎么实现的,他们背后的原理,我都不清楚。所以,我选取的还是那些博士、硕士论文作为经典边缘检测的一个参考,虽然这些普通的论文的质量相比于顶会论文差很多,但是对于新手而言可能会容易懂一些。

本人水平有限,如果文章哪里有错误的地方,请见谅并请指出,我会作出修改。

1.1.1边缘的定义及应用

什么是边缘?这个问题看起来基础但又至关重要,否则,边缘检测,连要检测的是什么都不知道,那检测出来的必然不会是好的结果。
目前,在传统的边缘检测中,都是把边缘定于为颜色急剧变化的区域。
在深度学习出现之前,传统的Sobel滤波器,Canny检测器具有广泛的应用,但是这些检测器只考虑到局部的急剧变化,特别是颜色、亮度等的急剧变化,通过这些特征来找边缘。但这些特征很难模拟较为复杂的场景,如伯克利的分割数据集(Berkeley segmentation Dataset),仅通过亮度、颜色变化并不足以把边缘检测做好。2013年,开始有人使用数据驱动的方法来学习怎样联合颜色、亮度、梯度这些特征来做边缘检测。当然,还有些流行的方法,比如Pb, gPb,StrucutredEdge。为了更好地评测边缘检测算法,伯克利研究组建立了一个国际公认的评测集,叫做Berkeley Segmentation Benchmark。从图中的结果可以看出,即使可以学习颜色、亮度、梯度等low-level特征,但是在特殊场景下,仅凭这样的特征很难做到鲁棒的检测。比如上图的动物图像,我们需要用一些high-level 比如 object-level的信息才能够把中间的细节纹理去掉,使其更加符合人的认知过程(举个形象的例子,就好像画家在画这个物体的时候,更倾向于只画外面这些轮廓,而把里面的细节给忽略掉)。[1]
近年来神经网络边缘检测的一些标志性事件
在CNN的方法中,在HED(Holistically-Nested Edge Detection)方法之前,都是采用局部的信息作为特征,把图像分解为很多patch,再去把从这些patch得到的特征合并。这样就是缺少高层次的特征,而在HED方法中,一改之前边缘检测方法基于局部策略的方式,而是采用全局的图像到图像的处理方式。即不再针对一个个patch进行操作,而是对整幅图像进行操作,为高层级信息的获取提供了便利。与此同时,该方法使用了multi-scale 和multi-level, 通过groundtruth的映射在卷积层侧边插入一个side output layer,在side output layer上进行deep supervision,将最终的结果和不同的层连接起来。[5]
在这里插入图片描述[2]
这是HED方法与Canny算子检测效果的对比,可以看出HED方法比canny算法有一个明显的优势。这可能意味着之后边缘检测研究的发展方向。
在这里插入图片描述
在这里插入图片描述 [2]
如图所示,加上deep supervision后,该方法可以在不同尺度得到对应抽象程度的边缘。
在这里插入图片描述
[2]
可见,该方法的效果有了很大提升(最上面的蓝色线即是该方法)。
可以预见,未来的边缘的定义必将是更高层次的抽象,但是由于本人能力所限,同时,目前大部分传统的边缘检测方法中都是把边缘当作上面定义的“颜色急剧变化的区域”,因此,本文后面对于边缘的定义也是“颜色急剧变化的区域”。

边缘特征是图像的一个重要特征,图像的边缘一般是图像的灰度或者颜色发
生剧烈变化的地方,而这些变化往往是由物体的形状结构、外部的环境光照和物体
的表面对光线反射造成的。图像的边缘能直接反映物体的轮廓和拓扑结构信息。图
像边缘检测技术是数字图像处理、模式识别、计算视觉的重要基础之一。图像的边
缘检测技术广泛应用于工业检测、图像分割`,、运动检测、人脸识别和目标
跟踪等领域。图像边缘检测的结果直接影响物体检测和识别的效果。[3]

1.2边缘检测方法简介

对于传统边缘检测,目前大致有三类边缘检测方法:
图像中的边缘检测一直是机器视觉领域中的研究热点,从年代至今,人们已经从不同的角度、不同的应用背景提出了很多方法,归纳起来分为三大类。
第一类是经典的边缘检测方法,如微分算子法、最优算子法和拟合法等。
第二类是以能量最小化为准则的全局提取方法,其特征是运用严格的数学方法对此问
题进行分析,给出一维值代价函数作为最优提取依据,从全局最优的观点提取边缘,如松驰法。
第三类是以小波变换、数学形态学、模糊数学、分形理论等近年来发展起来的高新技术为基础的图像边缘提取方法,尤其是基于多尺度特性的小波变换提取图像边缘的方法是目前研究较多的课题。其中,以上每一类都包含各种不同的边缘检测算法。[1]
此外,还诞生了一些如基于神经网络的边缘检测等近年来新兴起的方式。
在这里,由于本人并没有深入、系统地学习过图像处理,能力所限,主要介绍一下经典的边缘检测算法里的算子的方法,以及在传统的图像识别里的sift特征里同样提到的尺度空间概念。

1.2.1经典的边缘检测

这些方法都是前人研究留下的结晶,我认为首先先把他们的研究尽可能地去理解好,才能帮助启发我们自己的算法,在这个整理的过程中,我看到了很多思路在不同领域的运用。

1.2.1.1微分算子法

微分算子法是我们目前相对来说最熟悉的一种方法,是最原始、最基础的边缘检测的算法。这类算法主要是基于梯度,分为一阶微分算子和二阶微分算子两类。一阶微分算子即通过计算其像素点的灰度或RGB值的梯度变化,一阶微分较大者有较大可能是边缘,常见的有sobel算子,Robert算子,prewitt算子等。所有基于梯度的边缘算子之间的根本区别在于算子应用的方向,以及在这些方向上逼近图像一维导数的方式和将这些近似值合成为梯度幅值的方式不同。[3]在数字图像中常常以图像的一阶差分运算代替图像的一阶微分运算。
∆_x I(i,j)=I(i,j)-I(i-1,j) ①
∆_y I(i,j)=I(i,j)-I(i,j-1) ②
Roberts算子就是直接运用该差分,得到的模板。
但是一阶微分算子由于是一个梯度,具有方向性,因此在模板上,它具有一定的方向的选择性,如果图像中边缘比较契合该方向,则检测效果会比较好,如果边缘方向大多与该方向垂直,则可能检测效果比较差。由于该问题,出现了具有各项同性的Laplacian算子。
∇⋅∇ψ=(∂^2 ψ)/(∂x^2 )+(∂^2 ψ)/(∂y^2 ) ③

由于各项同性,对于各方向无差别,所以,它也有无法提供边缘方向的问题;另外,由于Laplacian算子是二阶微分,其近似也是通过二阶差分,所以该算子对于噪声的影响也会比一阶差分更大,这也是我们在一些文章中看到说Laplacian算子对噪声敏感的由来。
在实际计算中,一般通过卷积操作来近似计算,一阶微分和二阶微分在形式都比较相近,在卷积过程中,均通过相应的模板进行运算。
以下是常见的一阶微分模板:在这里插入图片描述

以下是二阶微分Laplacian算子的模板:
在这里插入图片描述

以下是用MATLAB自带的edge函数实现的边缘检测效果对比
在这里插入图片描述

一个比较直观的感受是,最优算子法的canny算子和LOG算子的阈值明显比微分算子法的sobel算子或Roberts算子要低,后者的漏检率相对较高,相应地噪声会比较少;前者的漏检率较低,误检率也相应地提高了,在这几种算子中canny算子对背景的塔的检测也更好,但是对于海水的检测则显得不是那么好。

1.2.1.1.1关于锐化算子模板里所有数之和为0的原因

当时在上面介绍自己的已完成的部分的时候,讲到对这些算子模板的介绍时,老师曾在下面提到“模板里所有数加起来为0”,当时并不知道为什么,最近,我在学习图像处理以及在查询相关论文时看到一些零碎的概念,突然就明白了这里是一个“灰度偏移”的概念。我们可以想象,如果把这个滤波器放进一个图像的一个局部,如果这里不是边缘,也就是这个局部的点的灰度或者RGB的值会非常接近,当进行卷积运算时,这里的值就会很接近于0,也就是不是边缘。
以Laplacian算子的模板为例。

在这里插入图片描述
假设这个矩阵是图像的非边缘部分 ■(1&1&1@1&1&1@1&1&1),那么它的和就为0。反之,如果模板中各数和不为0,那么,即使在非边缘,卷积得到的值也可能得到一个不小的值,造成这里可能是边缘的误判。因此,算子模板里所有数之和一般均为0.

1.2.1.1.2关于算子模板究竟如何得来的个人理解

我拿最简单、最好理解的Roberts算子为例,进行说明。
我把Roberts算子模板再次拿过来:
在这里插入图片描述
从这个算子的运算可以看出,是该点与对角线元素的灰度差的相反数,其实是一阶差分的计算,而一阶差分又是一阶微分的近似。
也是说 模板–(等于)–>差分–(近似于)–>梯度。
然后我觉得其他的算子应该也是大概这麽个思路,可是像sobel算子具体怎么来的,我现在能力有限,并不是很能推出。
我找了很多博客都没找到sobel算子■(-1&-2&-1@0&0&0@1&2&1)怎么来的。
在OpenCv的官网上的OpenCv-Python Tutorials里的Image Gradients这一章节里,对sobel算子有这样一句描述:sobel算子是高斯平滑和微分的结合,因此它更抗噪声。
在这里插入图片描述
我猜想这里可能是因为高斯函数的加入导致了这样的算子,但是OpenCv上只是主要讲解该函数的用法而不是详细介绍该算子,因此对于它的推导过程我仍然是不清晰。
在谭升的博客里,有这样的描述:sobel算子模板理解–谭升

在这里插入图片描述
在这里插入图片描述这个帕斯卡三角也给出了关于sobel算子55,77等更大维度的滤波器的参数的推广。

但是究竟是不是这样,我没有一个确定的答案,我甚至怀疑是不是也是根据实践的经验得到的而不是从0到有一步步推出来的,就像神经网络的架构,因为某次实践中发现这个架构的效果比较好,就拿来了这个架构,而不是从理论上推出,这导致了神经网络一直被提出新的架构,而不是能够根据某个理论直接提出一个最优的架构,似乎与这些不断提出的算子也有着一些相似之处。

1.2.1.2最优算子法

这类方法是在微分算子的基础上发展起来的边缘检测算子,根据信噪比求得检测边缘的最优滤波器。常用的有Canny算子和LOG算子(拉普拉斯高斯算法)。

1.2.1.2.1 Canny算子

Canny算子则是种一阶微分的边缘检测算法,它也是先通过Gaussian函数进行平滑,然后对图像进行一阶微分求极大值确定边缘。Canny首次在边缘提取算法中引入“非极大值抑制”的思想。如我最开始接触到边缘检测是在吴恩达的深度学习的视频里一样,这个非极大值抑制的概念我也是在目标检测这一章中最先看到的,它是用来优化YOLO算法的,不过现在在查阅边缘检测的论文里又出现了这个概念,而且是边缘检测里先引入,我就更加感受到虽然在不同的方向,却有很多共通的思想。
下面,我会更详细地介绍它的具体过程。

1.2.1.2.1.1噪声去除

前面已经提到,导数对噪声很敏感,因此,我们会先对图像进行高斯平滑,具体的高斯平滑的概念我会在后面介绍。

1.2.1.2.1.2计算图像梯度

这里根据sobel算子计算出水平方向和竖直方向的一阶导数(图像梯度G_X和G_y),并据此计算边缘的梯度的方向。
在这里插入图片描述

对于梯度的计算,考虑到开方运算相对比较耗时,实际计算中可以用以下公式替代:
在这里插入图片描述

1.2.1.2.1.3非极大值抑制

上一步得到的梯度图像存在边缘粗宽、弱边缘干扰等众多问题,因此还要用非极大值抑制来处理,C表示为当前非极大值抑制的点,g1-4为它的8连通邻域点的一部分。
图中蓝色线段表示上一步计算得到的角度图像C点的值,即梯度方向。dTmp1和dTmp2是在C点梯度方向的插值(因为梯度方向的对应的点不一定落在八邻域里)。
在这里插入图片描述

在这里插入图片描述
这样就使得边缘细化。因此最后生成的图像应为一副二值图像,边缘理想状态下都为单像素边缘。

1.2.1.2.1.4滞后阈值

现在要确定那些边界才是真正的边界。这时我们需要设置两个阈值:minVal 和 maxVal。这也是我们经常看到的所谓的Canny算子的双阈值,当图像的灰度梯度高于 maxVal 时被认为是真的边界,那些低于 minVal 的边界会被抛弃。如果介于两者之间的话,就要看这个点是否与某个被确定为真正的边界点相连,如果是就认为它也是边界点,如果不是就抛弃。如下图:
在这里插入图片描述
A 高于阈值 maxVal 所以是真正的边界点, C 虽然低于 maxVal 但高于minVal 并且与 A 相连,所以也被认为是真正的边界点。而 B 就会被抛弃,因为他不仅低于 maxVal 而且不与真正的边界点相连。所以选择合适的 maxVal和 minVal 对于能否得到好的结果非常重要。在这一步一些小的噪声点也会被除去,因为我们假设边界都是一些长的线段,而不是孤立的点,与老师提到的方法是一致的。
显然,这里的一个难点就在于如何处理中间的部分,即寻找弱边缘。这里的判断介于中间的点是否与边缘相连,与老师最开始在课上讲的方法基本一致,这个方法的实现也是比较麻烦,同时,由于计算代价过大,因为使用的是递归思维,且所找寻到的弱边缘点为数不多,因此实际应用中常常舍去这一步骤,取而代之的是基于形态学的边缘细化操作。

1.2.1.2.2LOG算子

LOG算子是一种二阶微分的边缘检测算法,是在拉普拉斯算子的基础上改进,也就是在拉普拉斯算子前先用Gaussian函数对图像进行平滑。事实上,我们已经在前面提到,Laplacian算子由于其是二阶差分,对噪声比较敏感,因此在进行Laplacian算子的计算时,先对其进行平滑处理,可能会使该算子的效果更好,也是比较方便我们理解的一种算子。

1.2.1.3拟合法

在我目前的学习来说,基本还没有接触过基于拟合法的边缘检测。因此,也算是比较陌生的一类。主要是因为拟合这一过程的计算量比较大,是基于图像的统计特征去提取边缘,一般用的也就比较少,只在一些比较大的视觉系统里用到。这里只是提一下,它的基本思想是根据最小二乘方法把图像的局部区域近似表示为一组基函数的线性组合,再根据拟合参数求得边缘,这种方法具有更高的抗噪声能力。

1.2.2多尺度边缘检测----sift特征

最开始上课时老师曾提到过这个sift特征不变性的概念,当时也是完全不了解,后来同样也是在学习图像识别时偶然发现这样一个概念。Sift特征是一种传统的图像识别的手段,它是一种模仿人的生理的设计,考虑到了一种视觉的不变性。比如一头大象,我们近处看,可能是大象很大,如果在远处看,那么看的大象可能就比较小,就是基于这样一种“近大远小”的理念,他们提出了“尺度空间”的概念。
在这里插入图片描述
在这里插入图片描述
通过不同的标准差,可以产生不同的尺度大小,尺度大的则模拟了近处看,尺度小即模拟了远处看。同时,尺度大时噪声的影响相对较小,相应地,也损失了图像的细节;而尺度小时受噪声影响比较大,图像细节则保持地更好。通过不同尺度下进行分别检测,加以综合,以期能够结合大小尺度的优势,那么其关键就在于如何选择不同的尺度以及如何进行多尺度的综合。目前所看到的论文中,大多是采用从粗到细或从细到粗的综合策略。

1.3.基于神经网络的边缘检测简介

随着深度学习的快速发展,基于神经网络的边缘检测也被提出,这种方法实质上是将边缘提取过程视为边缘模式的识别过程,只是在算法实现上利用了神经网络[1]。神经网络所具有的自组织性、自学习性以及自适应性决定了神经网络用于边缘检测的可行性。传统的微分算子以及最优算子法均需要人工设置阈值,阈值设置过高可能导致边缘断裂、不连续,从而丢失边缘信息。阈值设置过低可能导致提取的边缘中出现过多的伪边缘,甚至将噪声当做边缘提取。[1]而基于神经网络的边缘检测则不需要人工设置阈值,只需要通过样本中学习,就能获得一定的特征。神经网络的主要问题是,其学习的质量受样本质量影响较大,如果样本的质量不够好,那么学习的最后过程也必然不会好;另外一方面,是神经网络的结构设计上,需要人为去设计。
另外,在学习《数字图像处理》【冈萨雷斯】时发现,像一些所谓滤波器、padding、pooling等操作并非只是CNN特有,而是传统图像处理里本来就存在的,同样感受到这样的一种交叉融合。

1.4.边缘检测的步骤

其实在我看了一下刚雷萨斯的数字图像处理时发现这里的图像滤波和图像增强都是通过空间滤波或频率域滤波实现的,但是时间所限其实我并没有怎么看,只是粗略地看了一下大概,所以并不是很能深入理论地去介绍,更多的是通过比较直观、比较简单的去介绍这些内容。
边缘检测主要包括以下四个步骤:滤波、增强、检测、定位。[4]

1.4.1图像滤波

1.4.1.1为什么叫滤波?图像与波的关系?

提到图像处理,我们会经常看到图像滤波,滤波器等等概念,但是为什么要称为“图像滤波”,“滤波器”呢,图像跟波有什么关系呢?
没错,图像还真的与波有很大的关系,事实上,图像是可以用波来表示的。
那么,图像如何用波来表示的呢?这里,我又想到了CNN,在CNN的最后,常常将最后的卷积层展开为1维向量,如下图:

在这里插入图片描述

上图中用红色标记的部门,就是将这样的5516的张量展开为11400的张量。这里其实也是传统机器学习里对于图片的处理方式。看到这,有没有一点联想呢?
图像,实际上也是一个(None,None,3)(对于彩色图而言)的张量,(None表示可能是任意值)。类似地,我们可以将图像的三个通道分别展开为RGB三个通道的一维的向量。
下面这张图片是一张4004003的张量
在这里插入图片描述
如果把每一行所有像素(上例是400个)的红、绿、蓝的值,依次画成三条曲线,就得到了下面的图形。
在这里插入图片描述
X轴代表展开的一维向量的下标,Y抽代表8位二进制大小的灰度值。
可以看到,图像就这样表示为波的形式,同时,对比原图可以发现,曲线波动较大的地方,也是图像出现突变的地方。
在这里插入图片描述

这说明波动与图像是紧密关联的,图像本质上就是各种色彩波的叠加

1.4.1.2频率

在用波来表示的图像中,图像就是色彩的波动:波动大,就是色彩急剧变化;波动小,就是色彩平滑过渡。即频率越大的地方,色彩变化越剧烈,也越可能是边缘;频率越小,色彩变化越平缓,越不可能是边缘。看到这里,想必大家也就明白了,频率在这里,就充当了一个“梯度”的作用,用来衡量其是边缘的程度。

1.4.1.3常见滤波器介绍

我们知道了频率的含义,对于滤波器的理解就会更深一步,在我粗略地看冈萨雷斯的数字图像处理的时候,在频率域这一章节中看到了很多次两个名词,就是下面提到的低通滤波器和高通滤波器,但是当初看的时候,并不知道图像可以表示为波,也不知道这两个概念该如何理解,直至恰巧看到了阮一峰的博客,才豁然开朗。
物理上对波的处理已经比较深入,这里举出两类常用的滤波器,包括:
(1)低通滤波器(lowpass):减弱或阻隔高频信号,保留低频信号,即可以起到“平滑”的作用。需要注意的是,高通信号包括噪声和边缘,在平滑去噪的同时,也会造成边缘的模糊。
(2)高通滤波器(highpass):减弱或阻隔低频信号,保留高频信号,即可以起到“锐化”的作用。
实际上,在前面提到的微分算子所用到的模板就是属于高通滤波器,这里就不再重复,通常,在使用高通滤波器前,需要先使用低通滤波器,为什么呢?
前面我们提到了目前传统边缘检测主要还是基于微分算子,而无论是一阶导数还是二阶导数,对噪声都比较敏感,因此,在进行检测前,我们需要使用低通滤波器来进行去燥以降低噪声的影响。事实上,最优算子法(LOG算子和Canny算子)也就是这样做的,它们分别对二阶微分算子Laplacian和一阶微分算子先进行Gaussian平滑,然后再进行检测操作。
下面,我会介绍一下两种常见的低通滤波器:

1.4.1.3.1均值滤波

均值滤波就是将每个点的8领域作为模板,计算其灰度的平均值作为该点的灰度值。均值滤波本身存在着固有的缺陷,即它不能很好地保护图像细节,在图像去噪的同时也破坏了图像的细节部分,从而使图像变得模糊,不能很好地去除噪声点。因此,在实际应用中,我们常用的是下面提到的高斯滤波。

1.4.1.3.2高斯滤波

高斯滤波,在前面尺度空间那部分我已经稍微地提到了一些它的相关概念,这里主要是做一些补充。在这里插入图片描述

这是一个常见的高斯分布的图像,我们可以只看红黄蓝三条曲线,在这里,一个曲线与坐标轴的面积的总和是一定的。在图像中,我们的纵坐标其实就是灰度值的大小,我们可以通过控制其标准差,来控制其平滑的程度,标准差越大,整体就越平滑。我们可以看到通过控制标准差,可以很显著地将中央的值很高的点降低很多。其表现形式也是中央高,然后周围相等距离的领域的值相同,因此也算子的模板也是这种形式。

1.4.1.4中值滤波

中值滤波不是滤波器,但是也有着图像平滑的效果,因此也将其列在这里。如果要再次与CNN联想,我会想到pooling这个概念,在CNN中,pooling有最大值池化和均值池化,这里的中值滤波,在我看来,就像是“中值池化”。
中值滤波是指,将一个点的3*3的领域的灰度值排序后的中值作为该点的灰度。它的思想是,将可能是孤立点的“伪边缘点”(噪声)丢弃,保留的总是不太可能是噪声的点。假如有一个点与周围的点的灰度相差极大,那么它也就是一个噪声点,通过中值滤波,它就被忽略掉而被用中值代替。当然,这样也有局限性,即如果这样的噪声点有5个,即可能存在过滤失败的可能。中值滤波主要用于解决胡椒噪声(又叫脉冲噪声)的问题(即这种孤立的噪声比较多的噪声),效果比较好。

1.4.2图像增强

图像增强包括平滑和锐化。
平滑:可以将整体的灰度值变得更加平坦,如上面的Gaussian滤波等,主要用于去噪。平滑操作是很多边缘检测对图像进行预处理的不可缺少的一步。
锐化:即使原本大的更大,原本小的更小,将有显著灰度变化的点的变化放大。
这样做有什么用呢?之前在学python爬虫的时候,有一个验证码识别的例子,正好与锐化相关。
在这里插入图片描述
这是一个比较常见的验证码的图像,我们要用OCR对其进行识别,可是这个图像有很多的干扰线条,如果直接识别,识别效果会很差。但是如果通过转灰度、二值化处理,就会变成下面这样,黑白分明,无多余的线条干扰,识别的成功率就大大提高。
在这里插入图片描述

	Import tesserocr
	from PIL import Image
	
	Image = Image.open('imagename.jpg')
	
	Image = image.convert('L')
	threshold = 127
	table = []
	for i in range(256):
	    if i < threshold:
	        table.append(0)
	    else:
	        table.append(1)
	
	Image = image.point(table, '1')
	result =tesserocr.image_to_text(image)
	print(result)

这里其实也是这样一个思想,我先设定一个阈值,如果小于这个阈值(原本比较小的)我就让它为0(让它更小),大于这个阈值的(原本比较大的)我就让它为1(让它更大)。
这是在验证码识别里讲到的,它的思想就是锐化,目的就是去掉一些干扰,让图像更清晰,这只是简单的二值化处理,还有其他的很多更复杂的方法,但是这些方法背后的思想都是一样的。

1.4.3图像检测

设置一个阈值,灰度变化的梯度或者再加上其他的一些评估条件与阈值比较,找出边缘,其实这一步相对比较直接,重点在于前面的预处理的工作。

1.4.4图像定位

关于图像定位,因为我本身还没专门去看过传统数字图像处理方面的东西,然后我现在所了解的其实是基于深度学习的目标检测方法。
在深度学习中,图像定位的实现,其实就是在原有的图像分类中加以改进。在图像分类中,本来要输出的只是经过softmax函数得到的是某类图像的概率值,而在目标检测中,其实就是把输出的结果,除了输出softmax值外,还会有一个标签标记是否检测到物体,如果检测到物体,就会用四个参数,分别表示矩阵的左上角的坐标x,y,以及矩阵的长和宽,通过这样一个矩阵把目标定位出来。
根据所看到的一些资料,目前图像定位大概有以下大类:
①基于灰度:一般称为模板匹配, 直接以灰度进行匹配效果不好,对光照很敏感,所以一般会以灰度归一化互相关(NCC)作为匹配依据,增强光照变化下的鲁棒性,为了降低计算量,多采用图像金字塔来实现先粗后精的方式加快匹配速度,匹配出像素位置后,会进一步做亚像素插值,使匹配出的位置达到更高的精度,处理旋转和缩放也很直接,就是在限定的角度范围和缩放比例内,取一定的步长生成多张模版,一一进行匹配。模版匹配处理遮挡比较困难,对光照变化想当敏感,如果有遮挡,一般情况下就不好使了。
②基于特征:比如上面提到的sift特征,surf特征,这个方法在OpenCV中也有一些现成的函数,其大致思路就是提取特征点,用算法迭代求出相互匹配的特征,求出这些匹配特征点之间的变换关系。处理旋转缩放也很直接,选用具有仿射或投影不变性的特征即可。基于特征的匹配,对光照不太敏感,也可以一定程度上处理遮挡,提速和提高精度的方法和模版匹配里提到的基本相同,当然如果图像中提取不到足够多的特征点的话,这个方法就很难奏效了。
③基于几何形状:就是提取模版中的边缘和梯度,梯度方向等图像高频的部分,作为匹配的依据,对抗旋转缩放,提速,提高精度也和上面的类似。这一部分完整公开可用的代码很少,几乎没有,opencv里也没涉及,但这个算法被绝大多数商业库采用,因为它可以在光照变化,形变以及遮挡的情况下达到很高的鲁棒性。

参考文献

References:
[1]. 董鸿燕, 边缘检测的若干技术研究, 2008, 国防科学技术大学. 第 148页.
[2]. Xie, S. and Z. Tu, Holistically-Nested Edge Detection. International Journal of Computer Vision, 2017. 125(1/3): p. 3-18.
[3]. 曾俊, 图像边缘检测技术及其应用研究, 2011, 华中科技大学. 第 119页.
[4]. 段瑞玲, 李庆祥与李玉和, 图像边缘检测方法研究综述. 光学技术, 2005(03): 第415-419页.
[5] 程明明 边缘检测年度进展概述 VALSE2017

posted @ 2019-12-26 11:00  in_the_wind  阅读(2387)  评论(0编辑  收藏  举报