《OpenCV 2 Computer Vision Application Programming Cookbook》
   Chapter 6 Filtering the Images

  1. 滤波器。第一次接滤波器的概念,是在大二的电子设计实验课和信号与系统这两门课上。顾名思义,滤波,就是将信号的某些个频段的波给去掉,比如说像低通滤波器(low-pass filter),就是将高频段的波去掉,只允许低频波通过。对应到图像处理上,就是去观察图像的各个像素值的变化和分布。比如说,一副画有天空的图片,其大部分颜色都是蓝色,所以其像素变化小,可以归到“低频段”;相反的,一副画有各种场景、人物、物体的图像,其像素种类多、变化快,相对的就可以归到“高频段”了。工程上将这种方法叫做频域(frequency domain)分析,而在图像处理上叫做空间域(spatial domain)分析。这也是工程概念在图像处理上的一个典型应用。
  2. 卷积。在大二的复变函数和信号与系统这两门课上学过。不过因为遗忘再加上当年没学好,所以在看这章的时候相对来说有些吃力。在这里,卷积是图像处理中好多变换的基础,而其功能的实现主要是由其卷积核的形式来决定的。这个核本质上是一个大小固定、由数值参数参数组成的一个数组,数组的参考点(anchor pointer)通常位于数组的中心。以一个3*3卷积核为例:若要计算一个特定点的倦极值,将核的参考点与该点对应,核的其余元素与特定点周围的像素一一对应,将这些值相乘求和,并将结果放到参考点所对应点的位置。通过在整个图像上扫描卷积核,就可以实现对图像所有像素值的卷积操作从而实现莫种图像变换。
  3. Sobel Filter:求导(近似)。参考《学习OpenCV》P171:Sobel导数并不是真正的导数,因为Sobel导数定义在一个离散空间之上。Sobel算子真正表示的多项式拟合,也就是说,x方向上的二阶Sobel导数并不是真正的导数。它是对抛物线函数的局部拟合。这么理解,导数的大小表示的数值变化的程度,对应到图像处理上,就是反映各个像素值变化的快慢了(高数不好,先这么理解了)。

 
《OpenCV 2 Computer Vision Application Programming Cookbook》
  Chapter 5:Segmenting images using watersheds

断断续续地学习着OpenCV;书本已经看到了第五章,是关于分水岭算法(Watersheds algorithm)的;花了挺长的一段时间在这算法和代码的理解上,也查看了很多相关的资料介绍;不过还是不能很好的去理解该算法的使用原理和方法。

函数介绍:
C++: void watershed(InputArray image, InputOutputArray markers)
下面内容来自:OpenCV官方文档介绍
The function implements one of the variants of watershed, non-parametric marker-based segmentation algorithm, described in [Meyer92].
Before passing the image to the function, you have to roughly outline the desired regions in the image markers with positive (>0) indices. So, every region is represented as one or more connected components with the pixel values 1, 2, 3, and so on. Such markers can be retrieved from a binary mask using findContours() and drawContours() (see the watershed.cpp demo). The markers are “seeds” of the future image regions. All the other pixels in markers , whose relation to the outlined regions is not known and should be defined by the algorithm, should be set to 0’s. In the function output, each pixel in markers is set to a value of the “seed” components or to -1 at boundaries between the regions.


大致解释一下:该算法借鉴了地理学上的一些概念,将图像看成是一幅地图,根据图像中物体梯度的大小,将高梯度的看成是山脉,低梯度的看成是盆地或者是山谷,这样有助于分割目标;通过模拟浸入的过程,山谷中水越来越多,梯度越来越高,就会流过低些的山脉,从而流到别的山谷中,那么他们就连成了一片区域。区域分割的要求是把不同的标记分割成不同的地方。所以如果一直注水,可能就会覆盖别的区域了。这时算法就采取某种方法使修大坝(-1作为分界线)使标记的不同区域不会因为注水而相连,他们会互不相干的扩张领地,直到把整个领地都扩张完为止。

下面是一个简单的应用
  • 首先加载一张图片,之后将图片转换成二进制图片,并进行相应的阈值化处理,使图片前后景更加分明清楚