APP下载

化工仿真中图像处理图形学编程研究

2021-10-27

物联网技术 2021年10期
关键词:原图镜像图像处理

何 杰

(北方民族大学 化学与化学工程学院,宁夏 银川 750021)

0 引 言

OpenCV(Open Source Computer Vision Library)是一个广受欢迎、开放源代码的计算机视觉库;可被用于开发实时图像处理、计算机视觉及模式识别程序,目前在工业界及科研领域被广泛采用。OpenCV其实就是一堆C和C++语言源代码文件,其实现了许多常用计算机视觉算法。可以直接将这些源代码添加到软件项目中,而不需要自己再去写代码,重复“造轮子”,OpenCV的目标定位是成为实现工业生产流水线自动化的关键技术[1-2]。

利用OpenCV函数库,可以较好实现各种格式图片空间几何、色彩、明暗等变换操作。梅鸿翔 提出了一种目标定位方法[3],利用了OpenCV中摄像机标定模块。何小风将图像识别用于静电场描绘实验[4],利用OpenCV中cvtColor(将彩色图转换成灰度图)、Canny(得到二值图)、morphologyEx(弥合各区域缺陷点,使其成为完整圆形)、findContours(获得各点轮廓)等函数获取学生所绘打点图中所有电势点坐标,计算得到各等势圆半径测量值,再计算出 等势圆半径理论、测量值相对偏差,从而评判学生实验成绩。 马新明等在Visual C ++编译环境下,采用MFC多文档结构,借助OpenCV进行混合编程,开发了一个图像处理系统,并以冬小麦白粉病为例,利用该系统处理病害图像信息,进而为快速诊断作物病害种类,为用户提供辅助决策提供帮助,以降低作物病害影响[5]。赵浩杰等基于OpenCV函数库,提出一种识别图像中特定色彩目标的实现方法[6],即从视频流中提取图像帧,经过色彩空间转换(cvCvtColor)、特定形态学处理、设定阈值识别色彩、图像二值化、轮廓查找、筛选(调用cvInRanges函数) 等处理实现色彩识别、选取。渐变图是石油、地质行业中一种常见二维网格数据成图方式。郭佳采用图像处理库OpenCV,结合2D数据插值算法设计并实现了快速自动从渐变图还原出原始网格数据,能解决数据缺少或者获取数据成本和难度问题[7]。李红岩等基于OpenCV算法识别乒乓球、使用ARM平台为主控,设计并实现了一种乒乓球机器人运动、收集、分类、避障等功能[8]。OpenCV也被广泛应用于车牌检测和识别方面[9-10]。在本研究中,面向纹理贴图应用,探讨了图像处理图形学编程技术。在Microsoft Visual C++编译环境下,采用OpenCV混合编程,高效、便捷实现了图像空间几何变换。

1 理论基础

1.1 仿射变换

图像变换实质是改变像素空间位置。常用几何变换有刚体、仿射、投影和非线性变换等。几何运算包含空间变换和灰度插值算法两个独立算法。仿射变换是一种2D坐标之间线性变换,保持2D图形“平直性”(straightness,即变换后直线还是直线,圆弧还是圆弧)和“平行性”(parallelness,保持2D图形间相对位置关系不变),可以通过一系列简单变换的复合来实现包括平移(Translation)、缩放(Scale)、翻转(Flip)、旋转(Rotation)和剪切(Shear)等功能,可以用如下公式表示:

式中:tx,ty表示平移量;ai反映了图像旋转、缩放等变化。将tx,ty,ai(i=1~4)计算出,则可得到两幅图像坐标变换关系。

1.2 插值算法

对于比例缩放,有可能从原图中找不到与目标图相对应像素点。解决方法之一是找它最临近点,即利用邻域像素值来估计新像素值。这就是一种插值算法。常用插值算法有最邻近(Nearest Neighbour Interpolation)算法、线性(Linear Interpolation)算法、双线性(Bilinear Intrepolation)算法、曲线插值(Curvilinear Interpolation)算法。最邻近插值也被称为零阶插值,就是令变换后像素灰度值等于与它最相近输入像素灰度值。当图像中像素灰度级有细微变化时,该方法会在图像中产生人工痕迹,如图1所示。图1中,缩小图与原图比较丢失了很多信息;将图像放大,则需要对放大后多出来空格填入适当像素值。

图1 图像缩放最邻近插值法应用示意图

线性插值是使用原图中两个值来构造所求坐标值。例如,已知两点x0,x2处函数值f(x0),f(x2),要求x1处值f(x1),假如它是线性函数,利用几何知识可知:

在图像 处理中需要将线性插值扩展到二维情况,即采用双线性插值,也称其一阶插值。该方法通常是沿图像矩阵每一列(行)进行插值,然后对插值后所得矩阵再沿着行(列)方向进行线性插值。双线性灰度插值平滑作用可能使图像细节产生退化,这种现象在进行图像放大时尤其明显。图像处理中还使用双曲线插值及三次内插法解决图像缩放、旋转灰度填充问题。当将图像放大时,图像像素灰度插值也可通过卷积来实现。

2 镜 像

水平镜像,即左右变换,其中横坐标数值不变,纵坐标从大到小排列(原图,从小到大);垂直镜像,上下变换,纵坐标数值不变,横坐标从大到小排列(原图,从小到大)。可以将水平、垂直镜像变换关系用矩阵形式表示为:

水平镜像:

垂直镜像:

通过函数flip也可以实现翻转,如下:

cv2.flip(src, flipCode, dst)

src -输入图像

dst -输出图像

flipCode -翻转模式:

①flipCode=0垂直翻转(沿x轴翻转)

②flipCode>0水平翻转(沿y轴翻转)

③flipCode<0水平垂直翻转(先沿x轴,再沿y轴翻转,等价于旋转180°)

图2展示了镜像变换机理、程序核心代码及效果图。图中:create()被用来创建图像矩阵体;remap()表达每个像素位置(x,y);核心镜像变换代码被包含在内外for循环里。

图2 镜像变换核心代码及效果图

3 平 移

平移(TranslationTransformation)是一种刚体变换(rigid-body transformation),不会产生形变。例如某像素由点(x0,y0)被移至(x1,y1),位置灰度不变。两点之间关系为x1=x0+tx,y1=y0+ty,以矩阵形式表示为:

在此更关心其逆变换,x0=x1-tx,y0=y1-ty,因为需要知道平移后图像每个像素颜色。

如将平移后图像点(0,0)代入公式x0=x1-tx,y0=y1-ty,得到x0=-tx;y0=-ty。新图中点(0,0)颜色和原图中点(-tx,-ty)颜色一样,g(0, 0)=f(-tx, -ty)。

如图3所示,平移后,一种做法是不将图像放大,而移出部分被截断,文件大小不变;另一种是将图像放大,显示所有部分。设原图宽、高分别是w1,h1,则新图宽、高变为w1+|tx|和h1+|ty|。OpenCV中imageTranslation()被用来方便地实现图像平移操作。

图3 平移变换核心代码及效果图

4 缩 放

缩放(Resize)倍数为fx与fy。当fx=fy时,称其为全比例缩放。当fx≠fy时,图像像素间相对位置会发生畸变。缩放前后两点关系用矩阵表示为:

其逆矩阵为:

如图4所示,OpenCV中resize()被用来对图形进行缩放变换,便捷、高效。

图4 缩放变换核心代码及效果图

5 结 语

为将计算机图形学编程 用于化工仿真、虚拟现实,使用C++结合OpenCV编写了各种2D图像变换程序,得出结论:

(1)在Microsoft Visual Studio Enterprise 2019编译环境下,采用C++结合OpenCV计算机视觉库混合编程,高效、便捷地实现了图像平移、镜像、缩放变换。基于OpenCV函数库,大大简化了其实现过程,易于快速编程实现且效果较好。

(2)纹理映射可以赋予化工设备、管道、框架、厂房、场景等真实感,运用图形学编程对各种格式图形文件进行灵活变换有利于更好地应用纹理映射。

猜你喜欢

原图镜像图像处理
镜像
基于图像处理的机器人精确抓取的设计与实现
机器学习在图像处理中的应用
镜像
大家来找茬
基于图像处理的定位器坡度计算
镜像
镜像
Photo Shop通道在图像处理中的应用
出版原图数据库迁移与备份恢复