在Reading Book Notes 2中已经介绍的基本的操作方法,也就是点好火了,下面就要开始炒菜啦~
Opencv主要是针对图像进行处理的库,故它能解决一些数字图像处理中涉及到的图像处理技术,同时因为有封装好的方法,故其使用起来更方便直接,也解放了编程者对于底层的设计,使程序编写更高效~
当然,对于一些方法,理解其原理对于针对不同的实际问题会带来直接的帮助,比如在使用LSD(Line Segment Detector)进行直线检测时,相关参数的合理设置便显得尤为重要,而这二则需要对其原理有一定的理解,才能更好地设置其各个参数以达到所需的效果。因此,自己有另外补充一些数字图像处理的相关知识,加上之前有看过一些相关方面的内容,所以理解起来会稍微快一些了~在这儿附上我看的书名,《Visual C++数字图形处理》,《基于OpenCV的计算机视觉技术实现》。另外在编程的过程中还参考了《计算机程序设计基础教程——c++语言》,如果想对数字图像处理有更细致地理解,可以参考经典书籍冈萨雷斯《数字图像处理第二版中文版》对于自身而言,因为有针对具体的实际问题,所以我采用的方法是大体通读加深印象,在具体实现的过程中主根据所需解决的问题,想到解决方法,然后再进行相关的查阅。因为OpenCV中很多算法都已经进行了封装,个人认为了解了其原理,知道如何使用便可,不需要太在意其具体的实现算法。
下面进入正题吧:)
图像滤波
所谓滤波即利用一个核(kernel)对图像进行相应的计算,根据计算方式的不同,最后也将得到不同的图像输出,一般常做的处理是平滑和锐化,前者用于降噪,后者用于突出细节。
平滑:
中值滤波——能较好地处理掉椒盐噪声
高斯滤波——处理后的图片能更好地用于边缘检测
双边滤波——平滑后,能尽可能地保留边缘信息
【Tips:在之后做项目的过程中,接触到一种guided image filter,其是对双边滤波的一种优化,具体的可以参见论文。】
以上的滤波方法均有其实现了的对应函数,如图1:
锐化:主要进行的是一阶或二阶导的操作,但具体到应用的话,即不同的锐化算法,对应不同的核(算子),所以也就可以简单理解~~函数调用方法如下图2所示:
图像金字塔:即对图像进行不同尺度的缩放
a、高斯金字塔:其思路是将同一图片进行多次高斯模糊,并且向下取样,用以产生不同尺寸下的图片,用来进行后续所需的处理,如分割等。方法:首先用高斯核进行滤波,然后删除所有偶数行和偶数列。对应的函数如下图3所示:
b、拉普拉斯金字塔:在高斯金字塔运算过程中,图像经过滤波和下采样操作后会丢失掉部分高频细节信息。为描述这些高频信息,便定义了拉普拉斯金字塔(LP),用高斯金字塔的每一层图像减去其上一层图像上采样并高斯卷积之后的预测图像,得到一系列的差值图像即为LP分解图像。
注:opencv中暂时没有该函数的实现,但能由高斯金字塔的方法来间接得到。
形态学变换
一开始看到形态学变化不太能从字面上理解其含义,后面查阅到书籍,便有了一个直观地认识~~
其基本思想为:用具有一定形态的结构元素去量度和提取图像中的对应形状而这样的一种操作过程是建立在集合论的基础之上,也就是对图像的操作时间上是对集合的相应操作。但是为了明了简单起见,也就不用集合论的方式来解释其实现过程,而用代码地实现原理来说明可能会更助于理解~~
注:“结构元素”在图像中不断移动,可用来确定图像之间各部分的关系,结构元素一般是一些比较小的图像,其尺寸要明显小于目标图像的尺寸。
另外,本书中所叙述的是针对二值图像的形态学变换,在参考其他书籍时,主要到形态学变换还可进行基于灰度图的形态学变换,基本的形态学变换方式相似,只是针对灰度图时是基于数学图像函数而非集合论。
最基本的形态学变换:腐蚀,膨胀
腐蚀(Erode):使暗部扩张,亮部收缩。起作用是消除物体边界点,是边界向内部收缩。
操作原理:某个像素的输出值即为结构元素对应下原图范围的局部最小值。
膨胀(dilate):使亮部扩张,暗部收缩。将与物体接触的所有背景点合并到该物体中,使边界向外部扩张。
操作原理:某个像素的输出值即为结构元素对应下原图范围的局部最大值。
效果截图如下图4所示:
基于腐蚀,膨胀的扩展形态学操作:开运算,闭运算,击中/击不中变换,顶帽,黑帽
开运算(open):能够去除孤立的小点、毛刺以及断开小的连通区域,去除小物体、平滑较大物体的边界,并不明显改变其面积。
操作原理:使用同一个结构元素,先对图像进行腐蚀,再进行膨胀操作
闭运算(close):填充细小的空洞,连接邻近物体,弥合较窄的间断和细长的沟壑,平滑其边界,不明显改变目标图像的面积。
操作原理:使用同一个结构元素,先对图像进行膨胀,再进行腐蚀操作
注:虽然开运算与闭运算的操作顺序相反,但两者不具有互逆的关系。
Tips:开闭运算的功能效果取决于先进性的操作,后者的操作主要是用于平滑边界,并且都不明显改变物体大小。
击中/击不中变换(hit-or-miss transform, HMT):对于研究图像中物体与背景之间的关系会有很好的效果,是一个基本的形状检测工具,其输出结果是与模板相同的目标图像的位置点。
操作原理:同时探测图像的内部和外部,判断哪些成分在图像内,那些在图像外,从而确定图像的结构。
注:HMT是一种严格的模板匹配,它不仅指出被匹配点所满足的性质(即模板的形状),同时也指出这些点所不应满足的性质(即对周围背景的要求)。应用得不是特别广~对于这种变换,我只是大致了解了一下,自己在实际过程中目前还未用到。
顶帽(Top-Hat):用于检测出图像中较尖锐的波峰,从较暗(亮)且变换平缓的背景中提取较亮(暗)的细节。
操原理作:使用同一个结构元素,先对图像进行开运算;然后求源图像与开运算后结果的差。
黑帽(Black-Hat):突出比原图轮廓周围区域更暗的区域,分离比邻点暗一些的斑块
操作原理:使用同一个结构元素,先对图像进行闭运算;然后求闭运算后结果与源图像的差。
注:顶帽与黑帽,均是与原图的差值,也就是看在原图中减少或增加了怎样的成分,便是其突出的效果。
形态学梯度:可用于检测图像的边缘
操作原理:用图像膨胀的结果减去图像腐蚀的结果即得到图像的形态学梯度。
其函数使用可见下图5:
对于各种操作的实际运行效果,因为时间的原因,在这儿我就不重新运行展示了,网上这个方面的内容很全,这本书上只是大致地介绍了一下以及其使用方法,在这我把基本的操作方式在这贴上~如下图6所示
书中还提到LUTs(Look-up tables)即先建立一张灰度值转换表,然后针对一张图上每个像素的灰度值进行查表操作,得到最终输出的结果。
注:上面所说到的形态学变换是针对二值图像而言,对于灰度图像的形态学操作,其调用的函数一样,只是其针对的是对灰度图进行处理。下面进行简要的说明。
灰度图像的形态学操作:
【腐蚀】:因为边缘的灰度值较大,其会向灰度值高的区域内收缩。
【膨胀】:图像边缘向外延伸
【开运算】:可去除相对结构元素较小的明亮区域细节,保持整体的灰度和较大的明亮区域
【闭运算】:可去除相对于结构元素较小的暗细节,整体灰度和较大的暗区基本不变。
注:为了更直观地看出变换的效果,应该附上图片,但由于现在时间的关系,就过几天运行了之后在来这儿贴上吧~
由于篇幅的关系,本章中后面的内容就放到下节笔记中啦~