计算机视觉(Computer Vision,CV),是通过电脑算法去识别图像的一门学科。
图形图像在计算机上的应用,大概分为三个方面。
与图像的显示效果相关的,叫计算机图形学(Computer Graphics)。
与图像的压缩相关的,叫图像编码(image encoder)。经常说的H264、H265、VP8,都是图像的编码算法。
编码,都有对应的解码,它们是紧密关联的一个分支。
与图像的识别相关的,就叫计算机视觉(CV)。
OpenCV,是一个开源的计算机视觉框架。最早由intel发起,第一版使用C编写,从第二版开始改用C++编写。
C语言没有构造函数和析构函数,在需要矩阵计算的软件上,用起来很不方便。
著名的数学软件MATLAB,也是C++写的。
C++在科学计算领域,具有不可替代的地位。
这是一张在CV领域使用很广泛的图片,来自OpenCV自带的文件。
Lena,是这个女子的名字,拍这张照片时她还很年轻,但这张照片是50年前拍的,可见国外对计算机视觉的研究很早。
这也是一门古老的学科,在计算机诞生不久,人们就试图让它模拟人类的眼睛。
然后,人们就发现,让计算机“看东西”这个功能,实现起来非常有难度。
因为当时对人类视觉的深层原理(眼睛和大脑是怎么处理信息的),完全没有认识。
随着研究的进行,人们对图像的认识逐渐增多,形成了一套与图像相关的传统算法。由intel发起,最后开源给了业界,这就是OpenCV。
传统算法,都是可以给出完整解释的,以区别于暂时解释不了的深度学习模型。
在2016年以后,深度学习的应用越来越广泛,OpenCV里也添加了CNN之类的模块,可以与Tensorflow、Caffe2这些框架训练出来的模型对接。
OpenCV的架构,大概包含这么几块:
1,highGUI,这是个图形界面,用于显示图像效果的。
有了highGUI,就可以直观的查看处理之后的效果。
它常用的API是imshow(),显示图像。
图像数据要提前存放到一个矩阵里,把矩阵的引用传给imshow()函数。
2,core,这是opencv的基础模块,实现了很多最基本的数据结构和算法。
OpenCV的矩阵类Mat,就是定义在这个模块。
矩阵的加减乘除,也是在这个模块实现的。还有一些常用的其他运算,例如均值,方差,等等。
3,imgcodecs,图像的编解码。
它的常用API有两个:
imread(),读取一个图像文件,返回结果是一个存储了图像数据的矩阵。这个函数会自动做图像的解码。
imwrite(),把存储了图像数据的矩阵,写为一个图像文件。例如jpg、png格式的图片。它会自动做图像的编码。
这两个函数,再加上imshow(),就可以读写和显示图片了。
OpenCV不但可以读写图片,还可以读写视频。它可以把视频的每一帧读取为一个矩阵,也可以一帧帧的写入视频文件。
4,imgproc,图像处理,
这是OpenCV的关键模块,实现了很多的图像处理算法。
例如,高斯模糊、拉普拉斯变换、中值滤波、双边滤波,等等。
高斯模糊,GaussianBlur,也就是通常说的磨皮,在美颜算法中使用广泛。
它是通过计算中心像素(上图的紫色)与它周围像素(上图的蓝色和橘色)的加权平均值,来作为中心像素的新值。
权值的大小,依赖于离中心像素的远近,上图相同颜色的格子权值相同。通过二维高斯分布来计算。
经过高斯模糊之后,图像变得更平滑,即像素之间的差异更小。
如果脸上有青春痘的话,青春痘就会被磨平,变得不明显,所以叫磨皮。
拉普拉斯变换,Laplacian,多用于图像的边缘检测。
,
公式如上。
在图像变化比较平缓的地方,这个导数的值很小。
在图像变化剧烈的地方,这个导数的值很大。
在图像的边缘(图像中不同取域的交界线附近),拉普拉斯变换的效果特别明显。所以,它多用于边缘检测和图像分割。
如图,人的脸部轮廓还是看得出来的,尤其是眼睛附近。
中值滤波,medianBlur,它的作用主要是处理椒盐噪声。
椒盐噪声,就跟往菜上撒花椒面一样,数量少,但很显眼。
中值滤波,是以一个区域的像素值的中位数,作为中心像素的值。数量少的椒盐噪声,不可能是中位数,就会被过滤掉。
双边滤波,bilateralFilter,这是计算量最大的常用滤波方法。它同时参考了像素之间的位置差异和颜色差异,也是滤波效果最好的。
左边是原图,右边是双边滤波之后的照片(汗)。
原图是网上找的,特意找了个斑点比较多的(笑)。
5,局部特征点检测,features2d,
局部特征点,主要用于图像的匹配。
图像在经过变化之后,它的总体特征是有变形的。
例如,因为摄像头的角度不同,拍出来的图片会有不同的变化。
这两张图来自OpenCV的自带图片,都是国际象棋的棋盘,但是拍摄的角度不一样。
怎么判断它们是同一个东西?
这时就要用到在变化之下不变的特征,即局部的极值点。
极值点,与它周围像素的关系,在平移和旋转变换下是不会改变的。
如果有很多个极值点可以互相匹配,就可以认为两张图片来自于同一个物体。
与极值有关的图像特征,可以选SIFT算法或SURF算法,它们在OpenCV中都有实现。
OpenCV有OpenCV2、OpenCV3、OpenCV4三个大的分支,API有一些变化,但基本还是类似的。
它的源代码是C++写的,也提供了其他语言的API接口,底层依然是调用c++的opencv库。
"学习OpenCV 3 (中文版)",是最新的权威著作。
作者布拉德斯基(Bradski),他也是之前的学习OpenCV那本老书的原作者。
布拉德斯基的书,既有OpenCV框架的API用法,也有背后的原理的讲解,例如三维视觉的对极几何,摄像机的标定,等等。
他的学习OpenCV系列,是计算机视觉领域很好的入门书。
这个领域本身就是有一定的难度的,但没有NLP难。
联系人:徐经理
手机:13907330718
电话:0731-22222718
邮箱:hniatcom@163.com
地址: 湖南省株洲市石峰区联诚路79号轨道智谷2号倒班房6楼603室