3aa9aa2b7ce06b60b33c1e12979c2c98
Open CV 小鸡【记】(一)

前言

Open CV是Intel开发的一个计算机视觉库。我们终端团队的很多产品都与这个库息息相关,例如人脸检测、人脸识别、OCR识别,里面很多前置预处理、预检测、数据采集都是使用这个库实现的。简单来讲,Open CV就是将图像转化为计算机能够识别计算的数据,更进阶的用法就是提供图像预处理能力,将原图转化为机器学习算法能够直接处理的数据。有些人可能会将Open CV和Open GL混淆,其实可以这样理解,Open GL在一定意义上讲是Open CV的逆过程,将计算机的数据渲染成图像。

这系列的文章还会有更新两三篇,因为一下子写完整个系列,读者可能吃不消,所以分为多篇更新。

文章的API以Open CV3为标准,开发语言是C++,文章不对某个API的使用进行深入解析,这篇文章的目的是大家了解一些图像的基础数据结构和基础图像处理算法,以后对看到这些图像的数据结构或者算法时会有基础的认知。

本文内容总概

文章总概

文章总概

基础数据结构

Mat

Mat是Open CV里最最基础的数据结构,是一切图像处理操作的基础,可以这样暴力地理解,一个Mat对象代表一张图片,它由两个数据组成:矩阵头和指向存储所有像素值的矩阵。

Mat m(3,2,CV_8UC3,Scalar(0,0,255))

上面这行代码就是Mat最常见的创建形式,创建一个高度为3、宽度为2、颜色空间为BGR(跟RGB同个意思,在Open CV里像素的存储序列是BGR)、背景颜色是红色(0,0,255)的图像。CV_8UC3标识颜色空间,代表这个图像有三个颜色通道,每个颜色通道用8位的unsigned char标识,三个unsigned char就可以表示1600多万中可能的颜色。除了通过构造函数进行创建,还可以通过copyTo()、clone()、imread()(图片读取)、create()等方式进行创建。

从BGR可以延伸出一个图像像素的存储问题,常见像素编码(存储)格式有以下几种:RGB、HSV、HLS、YUV。RGB代表红绿蓝三颜色通道,有些图像会多一个alpha透明度通道。HSV和HLS,把颜色分解成色调、饱和度、亮度,这是描述颜色更自然的方式。YUV,把颜色分为色彩通道和亮度通道,在彩色电视视频信号和jpeg图片格式广泛使用。

针对Mat有很多基础的操作,例如通过设置Rect来设置感兴趣的区域(ROI),这个操作在图像处理领域经常用到,为的是专注和简化工作过程;通过split和merge函数对Mat进行颜色通道的分离和合成;通过addWeight函数对两个图片赋权进行混合。

离散傅里叶变换

从纯粹的数学意义上看,傅立叶变换是将一个函数转换为一系列周期函数来处理的。从物理效果看,傅立叶变换是将图像从空间域转换到频率域,换句话说,就是将图像的灰度分布函数变换为图像的频率分布函数。

变换的目的是为了方便对图像进行处理。傅里叶变换将图像分解成为正弦和余弦两部分,将原图像转换后为幅度图像加相位图像,幅度图像包含了原图像几乎所有的几何信息。

在频域里面,一张图里高频的部分代表图像的细节和纹理信息,高频分量表示图像中灰度变换比较快的那些地方,比如物体的边缘就是灰度的突然变化,所以物体边缘就是高频分量。而物体内部比较平坦的区域,灰度基本没有变化,对应的就是低频分量,低频部分代表图像的轮廓信息。比如低通滤波只让低频分量通过,往往就是使图像模糊,因为边缘信息被去除了。

Open CV使用dft()函数对图像进行离散傅里叶变换。

图像处理

滤波

图像滤波有两个目的:一个是抽出对象的特征作为图像识别的特征模式;二是为适应图像处理的要求,消除图像数字化时混入的噪声。例如人脸检测前一般需要对图像进行滤波操作。

滤波是将信号中特定波段频率滤除的操作,允许低频率通过称为低通滤波,允许高频率通过称为高通滤波,低通滤波就是模糊,而高通滤波就是锐化。

滤波有很多滤波算法,主要分为三大类:线性滤波、非线性滤波、形态学滤波。

线性滤波

线性滤波的基础操作就是将当前像素的值设置为该像素周围像素的加权和。常见的线性滤波算法有以下几种:

方框滤波:是一般化的线性滤波算法,当归一化处理的时候就是均值滤波,归一化是为了统一处理和直观量化,非归一化用于计算每个像素领域内的积分特性,对应的函数是boxblur();
均值滤波:归一化的方框滤波,主要方法是邻域平均法,像素周围8个像素的平均值代表当前像素的值,缺点就是去噪同时也破坏了图片的细节,对应的函数是blur();

top Created with Sketch.