system: [SYSTEM]

user: 2. 图像预处理 本文的应用背景为：从手机或电脑的摄像设备抓拍到的含有QR码图形的图片中识别QR码并提取出嵌入其中的信息。而使用手机或PC摄像头拍摄到的图像往往存在散焦模糊、阴影、反光、图形旋转及几何失真等缺点，若不降低或消除这些干扰，我们的译码结果将存在很大的误差，或者译码失败，因此图像预处理是QR码识别的关键 [ 6 ] 。如图1所示为实际拍摄得到的图像，以后图像预处理过程均以此图为例。 具体说来，图像预处理的目的是：通过对拍摄到的图像进行一系列处理从中准确地找到QR码图形，并通过图像矫正将其还原为标准的QR码图形。而译码则是对第一步得到QR符号进行解码，提取嵌在其中的信息。 图像预处理流程如图2所示。 图1. 实际拍摄的图像 图2. 图像预处理流程图 2.1. 图像灰度化 图像灰度化就是将彩色图像转化成灰度图像的过程。像素点是图片的基本单位，任何图片都由很多个像素点构成。每个像素点都有颜色，其颜色由该点的颜色值决定。我们知道，任何一种颜色都是由红R、绿G、蓝B三种基色混合而成，所以像素点的颜色值可用其三种基色分量表示为(R，G，B)，每一基色的分量值可为0~255之间的任意整数，所以彩色图像任一像素点颜色值的变化范围是1600多万(256*256*256)种。灰度图像是像素点颜色值的三个基色分量R、G、B相同的一种特殊的彩色图像，基色分量的值叫做灰度值，由此可见，灰度图像中的任一像素点颜色值的变化范围仅有256 (0~255)种。灰度图像在数字图像处理中的优势就在这里，因为它各像素点的颜色值范围较彩色图像极大地减少了，从而也极大地减少了图像处理过程中的计算量，缩短了处理时间。 图像灰度化方法很多，本课题采用加权平均值法。加权平均值法是根据各个基色的特性将三个基色分量以不同的权重进行平均，其计算各像素点灰度值的公式为： (1) 这样做的理由在于：三种基色中，人眼对绿色最敏感，其次是红色，对蓝色敏感度最低，因此当g > r > b时，所产生的灰度图像更符合人眼的视觉感受。通常r = 30%，g = 59%，b = 11%，图像的灰度最合理。在MATLAB中实现图像灰度化的源程序如下： QR_image_rgb=imread('haut_eng.png'); %读取一张彩色图像 QR_image_gray=rgb2gray(QR_image_rgb); %将读入的彩色图像灰度化 由于QR码图像是由黑白单元模块组成的，也就是说标准的QR码图像中各像素点仅含黑白两种亮度信息，不含色彩信息。故先对原彩色图像进行灰度化、再进行二值化是必要的，而且还能大大减少后续图像处理的计算量，提高运算效率。对例图灰度化的结果如图3所示。 2.2. 中值滤波 采集到的QR码图像在拍摄过程中因受到干扰而含有一定的噪声，且该类噪声主要是因光学采集系 图3. 灰度化结果 统而产生的椒盐噪声，图像处理中常用均值滤波和中值滤波来减小或消除此类干扰。均值滤波虽能有效减少该类噪声干扰，但是它在减少噪声干扰的同时会钝化图像的边缘及尖锐的细节信息，并且所使用的模板尺寸越大，图像就越模糊，图像边缘及细节信息丢失也就越严重。与之相比，中值滤波的输出是由邻域像素点的中间值决定的，不仅能平滑图像和降噪，还可以比较好地保留边缘的锐度和图像的尖锐细节 [ 7 ] ，因此本文选择中值滤波。 中值滤波属于非线性处理技术，其基本原理是：首先以某个像素点为中心建立一个邻域，这个邻域又被叫做窗口，然后将窗口里包括的所有像素点的灰度值按大小顺序排列，并取中间位置上的值作为该中心像素点的新的灰度值，若有两个中间位置，则取这两个值的算术平均值。 由上可知，中值滤波的效果取决于两个要素，即窗口的大小和形状。由于QR码图像的单元模块均为正方形，因此领域形状采用正方形较好。窗口越大，平滑的效果越明显，但图像边缘信息的损失就会越大，且随着窗口尺寸的增加，比较的次数将增大，计算时间会变长。本文根据实验结果选择3 × 3的正方形窗口。中值滤波部分的源程序为： QR_image_filted=medfilt2(QR_image_gray); %默认采用3 × 3大小窗口 其中QR_image_gray是图像灰度化的返回值。例图中值滤波后的图像如图4所示。 2.3. 图像二值化 上面已经说到，灰度图像中任一像素点的灰度值可以是0~255之间的任意整数，即有256个值可取，图像二值化就是将具有多灰度值的灰度图像转化为只有0或255两种灰度值的图像，即像素点颜色非黑即白的图像，也叫二值图像：当灰度值为0时像素点为白点，为255时像素点为黑点。其基本处理思路是:首先选择一灰度阈值T，然后按下式重新计算图像各像素点的灰度值： (2) 其中，x为各像素点的原始灰度值，f(x)为新灰度值。 二值化的意义在于标准QR码图像是由黑白单元模块组成的。二值图像在Matlab中是以矩阵形式存储的，矩阵的元素(i， j)就表示图像的第i行、第j列像素点的灰度值，且矩阵元素只有0和1两个值：0表示二值图像中对应像素点的灰度值为0，1表示对应像素点的灰度值为255。 计算阈值的方法很多，但总体上可以分为两类：全局阈值法和局部阈值法 [ 2 ] 。全局阈值法是将图像 图4. 中值滤波结果 中所有像素点看做一个整体，先按照某一特定的规则对这个整体进行统计，然后再对统计结果进行相应的计算处理而得到阈值T。最大类间方差法就是一种全局阈值法，其算法思路是：用阈值将像素点按灰度值大小分为两类，使得这两类的方差的加权和最小的阈值才是最恰当的阈值，某一类的加权系数就是该类像素点占总像素点的比例 [ 8 ] 。二值化部分的源程序如下： threshold=graythresh(QR_image_filted); %用最大类间方差法求全局阈值 QR_image_bw=im2bw(QR_image_filted， threshold); %用上面的全局阈值二值化 实验结果表明，即使是受到污损的QR码图像，采用最大类间方差法求阈值也可以得到效果很好的二值图像。本文例图二值化结果如图5所示。 2.4. 图像矫正 2.4.1. 图像旋转 [ 9 ] 如果图像仅方向上发生偏转，几何形状未变，那么可以直接通过图像的旋转来进行校正。旋转通常是以图象中心为圆心旋转，如图6所示，在XOY坐标平面内，A点坐标为(x， y)，线段的长度为r，且与x轴的夹角为 。现将线段以O点为中心顺时针旋转 角至位置， 坐标为 。 旋转前： (3) 旋转 角度后： (4) 这样，我们就可以根据旋转前图像各像素点的坐标计算出旋转后图像中对应像素点的坐标，同时由旋转前图像的像素点的灰度值可以得出旋转后的图像各像素点的灰度值。但是，从上面的旋转公式(4)可以看出，转换过程存在浮点运算，计算出来的旋转后的图像的点坐标可能不是整数，为保证图像旋转后的各点灰度值的准确度，必须对旋转后的图像各点进行插值运算，本文采用双线性插值法。 双线性插值(又叫一阶插值)的输出灰度值是在它输入图像对应像素点的2 × 2邻域内所有点的灰度值的平均值，能克服灰度不连续的缺点，相比零阶插值效果更好，在效果和运算时间上均能很好地满足识别要求。其数学模型如图7所示，OABC为XOY平面内的一个边长为W的正方形，四顶点坐标如图所 图5. 图像二值化结果 图6. 图像旋转示意图 图7. 双线性插值的数学模型 示，表示XOY平面上任一点的灰度值，且已知在正方形OABC四顶点上的值。现采用双线性插值法求正方形OABC内任一点的灰度值，其步骤如下： 1) 对顶点 、 进行差值得： (5) 2) 对顶点 、 进行差值得： (6) 3) 做平行于Y轴方向的插值得： (7) 把(5)式和(6)式代入(7)式得： (8) 本部分源程序为： A=imrotate(image，-α，’bilinear’); %图像image采用双线性插值法逆时针旋转α角。 2.4.2. 几何失真矫正 事实上，由于摄像头与QR码图像所在平面不平行或QR图像本身的不平整，造成拍摄到的QR码图像大多是畸变的四边形，即发生了几何失真，如图1所示。几何失真的存在不可避免地给QR码的识别及译码带来了困难，因此必须矫正。矫正思路是：以畸变的QR码图像的4个顶点为控制点进行平面投影转换，将畸变的四边形区域通过一定的映射关系转换到正方形的QR码区域中。 1) 获得控制点 考虑到QR码自身的特点，可先利用Sobel算子对几何失真的图像进行边缘检测，然后对检测出的点进行Hough变换找到4条边界直线，再由4条边界直线的交点来求得4个顶点。边缘检测的目的是减少Hough变换的计算量。其中Sobel算子是一阶导数的边缘检测算子，在算法实现过程中，通过3 × 3模板作为核与图像中的每个像素点做卷积和运算，然后选取合适的阈值以提取边缘。 2) 平面投影转换 [ 10 ] 如图8所示，A， B， C， D为四个控制点，坐标分别为 ， ， ， . ， ， ， 分别为A， B， C， D的投影点，坐标分别为 ， ， ， 。 正方形区域的边长W取畸变四边形边长的平均值，则转换后4个顶点的坐标分别为 ， ， ， 。 平面投影转换公式 [ 11 ] 如下式(9)、(10)， 为待解的8个参数，将转换前后4组对应坐标点代入两式后即可解得参数值。 图8. 平面投影转换映射示意图 (9) (10) 整理后可得： (11) (12) 把 ， ， ， 四点坐标带入(11)、(12)式，并写成矩阵形式得： (13) 解得： (14) 将解得的8个参数代入(9)、(10)式中，即可建立投影后正方形图像内任一点 与投影前畸变四边形中的点(x， y)的对应关系。 由于存在浮点运算，正方形图像中的点通过上面的变换可能会对应到畸变四边形内的非整数点，在此仍然采用双线性插值法对这些点进行灰度插值运算，以获得这些点的准确灰度值。本文例图经图像矫正后的结果如图9所示。