指针式仪表自动读数与识别(二):仪表图像预处理

老吴2019-03-19 10:24图像2552浏览


版权声明:本篇文章为原创文章,转载请注明出处。https://yao2san.com/article/1998

一、仪表图像预处理

1.预处理操作

在做任何图像处理相关操作之前都要先进行预处理。预处理操作包括:

(1) 缩放和变换

缩放操作的主要目的是减小图像大小,减少计算量,缩放操作不是必须的,但是如果系统对输入图像的大小有要求,比如需要归一化处理,那么就需要进行缩放,常见的缩放方式有等比缩放和强制缩放。

等比缩放是指按原始图像的长宽比例进行缩放,缩放后的图像大小不变;强制缩放是指按照设定的长宽进行缩放,缩放后可能导致图像变形。

其实缩放属于图像变换中的仿射变换中的一种,相对应的还有透视变换等,这两个变换都是图像处理中最基本的两种变换。

仿射变换和透视变换更直观的叫法可以叫做“平面变换”和“空间变换”或者“二维坐标变换”和“三维坐标变换”。

仿射变换:

简单说来,就是允许图形任意倾斜,而且允许图形在两个方向上任意伸缩的变换。仿射变换,可以保持原来的线共点、点共线的关系不变,保持原来相互平行的线仍然平行,保持原来的中点仍然是中点,保持原来在一直线上几段线段之间的比例关系不变,但是,仿射变换不能保持原来的线段长度不变,也不能保持原来的夹角角度不变。

仿射变换可以通过一系列的原子变换的复合来实现,包括:平移(Translation)、缩放(Scale)、翻转(Flip)、旋转(Rotation)和剪切(Shear)。

透视变换:

是指利用透视中心、像点、目标点三点共线的条件,按透视旋转定律使承影面(透视面)绕迹线(透视轴)旋转某一角度,破坏原有的投影光线束,仍能保持承影面上投影几何图形不变的变换。

透视变换常用于,例如在移动机器人视觉导航研究中,由于摄像机与地面之间有一倾斜角,而不是直接垂直朝下(正投影),有时希望将图象校正成正投影的形式,就需要利用透视变换。

说白了就是将2D矩阵图像变换成3D的空间显示效果。

(2) 灰度化

灰度化的目的之一是将原有的三通道的RGB彩色图像转化为单通道的灰度图像。当R=G=B时的值就称为灰度值,因此灰度值的取值范围是0-255。

RGB转灰度计算公式为:

Gray = (R×30 + G×59 + B×11 + 50) / 100

(转换公式有多个,根据场景不同,有的要求效率,有的要求精度,所以最终结果可能会有一点偏差,这里给出的是一种计算效率较高的转换公式)

对于颜色空间,在图像处理中,常用的就是RGB和YCrCb,YCrCb常用于肤色检测。具体详细的颜色空间的介绍,请参考大牛写的文章:图像处理中常用的彩色模型

图像灰度化的重要目的之一是减少处理的数据量,加快计算速度,因为灰度图只有一个通道,只需要计算一个值即可。

(3)去噪和平滑

去噪和平滑是预处理中最重要的步骤之一,去噪的效果完全可以影响最终的处理效果。这里所说的噪声不仅仅包括设备拍摄时所产生的斑点、较验噪声等,还包括我们所不感兴趣的部分,比如多余的点,多余的线条等等。那么对于斑点和椒盐噪声,可以使用中值滤波来进行消除,对于其他的我们不想要,不感兴趣的部分,则可以通过一系列其他操作来过滤,比如模糊处理,图像加减法等进行过滤和消除。

各种滤波操作我就不重复造轮子了,因为自己重写的不一定比别人写的好,这里分享两个链接:

图像去噪算法简介

图像的预处理过程简介

(4)膨胀和腐蚀

膨胀就是求局部最大值的操作,而腐蚀则是求局部最小值的操作。简单来说,膨胀就是增加白色(像素值高的)区域,而减小黑色(像素值低的)的区域,腐蚀则相反。

在仪表识别中通过腐蚀/膨胀操作来加强或者消除刻度区域以及指针等等。也就是说膨胀和腐蚀操作可以增强我们感兴趣的区域,也可以减少噪声,可以看作是一种滤波操作(事实上,它就是形态学滤波操作)。

关于膨胀和腐蚀的一篇好文章:形态学图像处理(一):膨胀和腐蚀

2. 仪表图像预处理

仪表图像预处理的目的是去除噪声和强化表盘和指针特征。

基本步骤以及对应的Emgucv里的函数如下:

(a)缩放:Image<TColor, TDepth> Resize(double scale, Inter interpolationType);

(b)灰度化: Image<TOtherColor, TOtherDepth> Convert<TOtherColor, TOtherDepth>()

(c)中值滤波: Image<TColor, TDepth> SmoothMedian(int size)

(d)高斯/双边滤波:Image<TColor, TDepth> SmoothGaussian(int size)Image<TColor, TDepth> SmoothBilatral(int kernelSize, int colorSigma, int spaceSigma)

(e)开/闭运算:Image<TColor, TDepth> Dilate(int iterations)Image<TColor, TDepth> Erode(int iterations)

以上步骤不是必须的,要根据具体环境和图像进行处理。若图像有畸变,则还需要进行畸变矫正。

原始图像 中值滤波+高斯滤波

赞一个! (15)

文章评论(如需发表图片,请转至留言)