基于Android平台的雾霾天图像增强软件的设计与实现

2023-04-27 04:05李俊贤张高菘张菲菲周晓彤林叶黄炜浩庄佳森
电脑知识与技术 2023年8期

李俊贤 张高菘 张菲菲 周晓彤 林叶 黄炜浩 庄佳森

关键词:Android;OpenCV;暗原色先验;图像去雾

中图分类号:TP311 文献标识码:A

文章编号:1009-3044(2023)08-0037-03

0 引言

随着智能手机等移动应用设备的普及,人们对移动设备摄像技术的成像速度和成像质量提出了越来越高的要求,尤其在恶劣环境条件下,面向移动终端的图像处理技术显得越来越重要。当前,移动设备在恶劣环境下(雾霾天气)获取到的图像存在环境随机噪声干扰严重和对比度差等问题,拍摄的图像不能满足用户需求。许多学者对雾霾天图像的增强方法展开了深入的研究,并取得了较为显著的成果,现有的雾霾天图像增强方法主要分为空域方法、频域方法和混合域方法[1]三种。当前研究在各大移动终端设备平台上的图像增强应用技术并不多。因此,研究将图像去雾等图像增强方法与Android 平台相结合的应用,在未来定会有很高的应用价值和发展前景。鉴于此,本应用结合专业的开源图像处理库OpenCV与暗原色先验算法,研究了一款雾天图像增强的移动应用软件,以满足雾霾场景的清晰化成像。

1 去雾图像清晰化成像应用框架体系

如图1所示,运行本软件后,进入软件的主页面,软件的功能清晰明了,主要针对雾霾图像进行处理,点击功能按钮后,软件会触发监听事件,呈现“相册选取”与“相机拍摄”两个选项供用户选择,首次点击会申请手机内存读写权限与摄像头调用权限,点击“相册”按钮则会打开相册,在用户选择图片后,显示选择后的图片;点击“相机拍摄”,则会调用手机摄像头,获取图片流数据。

在处理图像页中,会显示进行图像增强处理后的图像,提供两种保存的形式,点击“保存至本地”,应用将图片数据写入至手机内存卡,保存到本地相册中;点击“保存到云端”,便会在线上传到云端后台数据库中。

如图2所示,在软件的开发过程中,页面跳转逻辑、数据传递等主要采用Java代码开发,通过Android平台中JNI[2]本地接口使用C++语言,调用图像处理算法,同时在算法中调用OpenCV库所提供的视觉预训练模型,实现图像增强后再通过JNI返回结果。本应用中采用Cmake的形式,进行跨平台C语言图像处理算法编译[3]。

完成图片增强类型选择后,获取图片的方式有两种:一是通过拍照获取图片,主页面的方法中向用户申请权限,点击后创建对象,用于存儲拍照后的图片,在对图片存储的过程中,需要对运行设备的系统版本进行判断,以7.0作为阈值,对不同版本的系统进行不同的图片对象转换;二是通过相册获取图片,读取图片借助媒体库的内容提供者MediaProvide,图片列表展示采用的是RecyclerView加载列表数据,Glide框架展示图片,借助LoadManager异步加载媒体库中图片的数据,通过对RecyclerView.Adapter添加相应监听事件,实现对图片选择与否动态的UI变化[3]。

2 去雾图像增强算法实现

在学术界上,对有雾图像的定义是:

I (x) = J (x)t(x) + A(1 - t(x)) (1)

即为有雾图像=无雾图像*透射率+全球大气光成分(1-透射率)[4],在公式中,I(X)是现已经有的图像(待去雾的图像),J(x)是要恢复的无雾的图像,A是全球大气光成分,t(x)为透射率,现已知有雾图,求出无雾图。

要实现暗通道先验原理的去雾算法,需要实现四个步骤,算法流程如图3所示:

2.1 暗原色先验

何恺明[4]通过大量的研究实验发现,在海量的没有雾且干净的图片中,绝大多数的图像某些局部区域内,存在着某一些像素点在R、G、B三个通道中总会有一个或者多个颜色通道的灰度值具有很低的值甚至趋近于0,因而把J,即为晴朗天空下的图像进行分块,并进行最小分量的求解,对各个像素便有了暗原色通道的定义表达。

其中J表示彩色图像的每个通道,Ω(x)表示以像素为中心的一个正方形邻域,对图像进行RGB分解,取得局部块中的最小值,根据暗通道理论得到,暗通道最小值趋近于0,即Jdark趋于0。在此公式的表达中,实现的就是将图像置于以像素为中心的窗口中,求得该图像在这个邻域的暗原色,在带雾的图像中,这些暗原色的值会升高。

2.2 计算透射率

对上述公式稍做处理,变形为下公式:

其中c 表示的是RGB三通道,再进一步假设,在暗通道推算中的局部区域,即所规定的正方形邻域中,邻域块Ω(x)是连续的且恒定不变的[4],对上述公式做出两边求两次最小值的运算后,结合暗原色先验的理论,得到透射率的粗估值:

由上述公式中所获取到的透射率仅为预估值,要获取更为精细的透射率图,何恺明博士在文章中提出了soft matting方法,可以得到非常细腻的结果,出于对速度的考虑,最终采用引导滤波的方式来获得较好的透射率图[5]。

何恺明博士的算法认为,在清晰的目标图像上,相邻的点总是线性相关的,待处理图不清晰是因为图像上存在的噪声,导致部分不相关[5]。故在进行滤波时,可以设置与待处理图有着相同梯度的引导图,求取能使待处理图与目标图无限接近的线性相关核W。

2.3 估计大气光

求取全局大气光强A,根据上述公式中求得的暗通道,然后进行以下操作:

1) 通过雾浓度最大的地方进行选取,即暗通道中前0.1%中最亮的像素,求原图像暗通道的前千分之一最亮(灰度值最大)的像素点。

2) 在原图中找到这些像素点,取其中最大亮度值(在此认为是三个通道灰度值的和)作为大气光A。

综合以上从而得到了最终J的求解公式:

2.4 去雾算法在Android平台上的实现

在安卓平台上,图像增强是在点击雾霾图像处理按钮后,触发后台所设定的监听事件,调用函数获取图片的真实路径,选择需要处理的图片后,所选的图片便会在图片控件上呈现。并显示“正在处理,请稍等片刻”的字样[6]。此时,在Android中,通过函数接口中的请求,利用个人的加密令牌请求到指定url上的图片增强处理接口,通过暗通道先验算法来增强图像,并将最终的图片覆盖到原图片上,暗通道先验算法分为五步,其流程如图4所示。

如图4所示,在图片传入API中后,在接口中完成对图片暗通道的获取方法,并得到图像的透射率以及大气光照,接着对图像回代公式处理时,考虑到大气中的实际情况,总会不可以避免地包含一些杂质分子,因而在去雾的同时,会实现远处雾的保留,引进一个常数ω(0<ω≤ 1)[4] ,有针对性地保留一部分覆盖遥远景物的雾,完善图像的深度感与真实感。

图5显示了图像处理前以及图像处理后的效果对比,在整个调用过程中,需要对Android进行内存、相机的权限请求,能够提供两种保存的形式,让图片在Android页面跳转过程中,不因Intent传输大小的限制而导致图像质量的压缩,能够高保真地恢复原图像中的细节和色彩,提高了图像的清晰度。

3 结论

本文开发了一款兼备实用性以及普适性的雾天图像增强软件,软件中向用户提供了图像去雾的功能,通过CMake调用OpenCV 库的方式[6],调用外部接口,实现暗通道先验去雾算法来对雾天图像进行增强,经过多次对图片读取、采集以及处理前后对比的验证,结果表明,软件实用且有效,能够对雾天图像进行较好的处理。未来将继续对算法进行改进,达成透射率的空间自适应估计,整体降低算法的时间复杂度,进一步提升软件的性能。