中央广播电视大学开放教育专科毕业论文基于安卓平台的图像引导滤波算法的实现.docx

上传人:b****8 文档编号:12951900 上传时间:2023-06-09 格式:DOCX 页数:25 大小:1.18MB
下载 相关 举报
中央广播电视大学开放教育专科毕业论文基于安卓平台的图像引导滤波算法的实现.docx_第1页
第1页 / 共25页
中央广播电视大学开放教育专科毕业论文基于安卓平台的图像引导滤波算法的实现.docx_第2页
第2页 / 共25页
中央广播电视大学开放教育专科毕业论文基于安卓平台的图像引导滤波算法的实现.docx_第3页
第3页 / 共25页
中央广播电视大学开放教育专科毕业论文基于安卓平台的图像引导滤波算法的实现.docx_第4页
第4页 / 共25页
中央广播电视大学开放教育专科毕业论文基于安卓平台的图像引导滤波算法的实现.docx_第5页
第5页 / 共25页
中央广播电视大学开放教育专科毕业论文基于安卓平台的图像引导滤波算法的实现.docx_第6页
第6页 / 共25页
中央广播电视大学开放教育专科毕业论文基于安卓平台的图像引导滤波算法的实现.docx_第7页
第7页 / 共25页
中央广播电视大学开放教育专科毕业论文基于安卓平台的图像引导滤波算法的实现.docx_第8页
第8页 / 共25页
中央广播电视大学开放教育专科毕业论文基于安卓平台的图像引导滤波算法的实现.docx_第9页
第9页 / 共25页
中央广播电视大学开放教育专科毕业论文基于安卓平台的图像引导滤波算法的实现.docx_第10页
第10页 / 共25页
中央广播电视大学开放教育专科毕业论文基于安卓平台的图像引导滤波算法的实现.docx_第11页
第11页 / 共25页
中央广播电视大学开放教育专科毕业论文基于安卓平台的图像引导滤波算法的实现.docx_第12页
第12页 / 共25页
中央广播电视大学开放教育专科毕业论文基于安卓平台的图像引导滤波算法的实现.docx_第13页
第13页 / 共25页
中央广播电视大学开放教育专科毕业论文基于安卓平台的图像引导滤波算法的实现.docx_第14页
第14页 / 共25页
中央广播电视大学开放教育专科毕业论文基于安卓平台的图像引导滤波算法的实现.docx_第15页
第15页 / 共25页
中央广播电视大学开放教育专科毕业论文基于安卓平台的图像引导滤波算法的实现.docx_第16页
第16页 / 共25页
中央广播电视大学开放教育专科毕业论文基于安卓平台的图像引导滤波算法的实现.docx_第17页
第17页 / 共25页
中央广播电视大学开放教育专科毕业论文基于安卓平台的图像引导滤波算法的实现.docx_第18页
第18页 / 共25页
中央广播电视大学开放教育专科毕业论文基于安卓平台的图像引导滤波算法的实现.docx_第19页
第19页 / 共25页
中央广播电视大学开放教育专科毕业论文基于安卓平台的图像引导滤波算法的实现.docx_第20页
第20页 / 共25页
亲,该文档总共25页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

中央广播电视大学开放教育专科毕业论文基于安卓平台的图像引导滤波算法的实现.docx

《中央广播电视大学开放教育专科毕业论文基于安卓平台的图像引导滤波算法的实现.docx》由会员分享,可在线阅读,更多相关《中央广播电视大学开放教育专科毕业论文基于安卓平台的图像引导滤波算法的实现.docx(25页珍藏版)》请在冰点文库上搜索。

中央广播电视大学开放教育专科毕业论文基于安卓平台的图像引导滤波算法的实现.docx

中央广播电视大学开放教育专科毕业论文基于安卓平台的图像引导滤波算法的实现

中央广播电视大学开放教育(本/专)科

毕业论文(设计)

题目:

基于安卓平台的图像引导滤波算法的实现

姓名:

学号:

年级:

专业:

指导教师:

 

吉林广播电视大学桦甸市分校

二0一五年二月

 

 

基于安卓平台的图像引导滤波算法的实现

第1章研究背景及意义

在计算机视觉和计算机图形学中大多数程序都牵涉到通过图像滤波来降低噪音或者提取有用的图像结构来对图片进行相应优化的思想。

一些简单的线性平滑滤波算法如高斯滤波器,拉普拉斯算子过滤器,索贝尔过滤器广泛的应用于图像模糊,图像锐化,边缘检测和特征提取等方面。

但是线性平滑滤波过滤器的滤波核是固定不变,独立于任何图像内容。

但在许多情况下,我们可能希望在过滤过程中将给定的引导图像额外的信息体现出来。

第一种解决方案就是通过考虑引导图像优化算法所执行的二次方程,这种解决方案是通过处理以引导图像信息编码的大型稀疏矩阵,这些非齐次的矩阵隐含了变动的滤波核。

这种处理方法广泛的应用在许多应用比如;着色,抠图,多次度分解和图片消雾中。

另外的一种方法通过引导图像生成滤波核。

比如双边滤波器可以实现平滑滤波的同时还能具有良好的边缘保持性能,但是会产生一些额外的梯度逆转伪影。

而由微软亚洲研究院何恺明博士提出的一种图像引导滤波算法[]。

这种算法本质上是引导图像的线性转换。

该算法能够像双边滤波算法一样较好的实现平滑滤波还能具有良好的边缘保持性能,而且不产生梯度逆转伪影。

而且他也和拉普拉斯矩阵相关,也是在平滑滤波方法中可被接受的一种理念,图像引导滤波算法计算与滤波核的大小无关。

此外,引导滤波器对于灰阶图和彩色图都有精确地算法,在大量的应用中实验证明图像引导滤波算法在效果和效率上有很不错的表现。

随着android手机的普及,各式各样的应用层出不穷,但是在手机图像方面人们往往希望在手机屏幕中显示更为绚丽清晰的图像。

但是目前很多高像素手机拍摄出来的照片因为相机硬件问题,光照,抖动等各种因素照成不如人意的图片。

如果能够在手机上直接对刚生成的图片进行相应的处理和优化那无疑是对手机拍照功能的一大补充。

针对这一情况,本次课题的目的是在Android手机平台上使用图像引导滤波算法实现对图像的优化及处理。

第2章Android系统相关知识介绍

2.1Android系统的诞生与发展

2003年10月,有“Android之父”之称的AndyRubin在美国加利福尼亚州帕洛阿尔托创建了Android科技公司.2005年8月17日,Google收购了Android科技公司,Android科技公司成为Google旗下的一部分。

之后,鲁宾着手负责开发基于Linux内核的移动操作系统即后来的Android操作系统。

2007年11月5日,在Google的领导下,手持设备联盟(OpenHandsetAlliance)成立,第一批成员包括Broadcom公司、HTC、Intel、LG、Marvell等公司。

开放手持设备联盟的创建目的是为了创建一个更加开放自由的移动电话环境。

也在同一日,手持设备联盟联盟对外展示了他们的第一个产品:

一部搭载了以Linux2.6为内核基础的Android操作系统的智能手机。

后来新一批成员陆续加入联盟,同时,一个负责持续发展Android操作系统的开源代码项目成立了AOSP(AndroidOpenSourceProject)。

除了开放手持设备联盟之外,Android还拥有全球各地开发者组成的开源社区来专门负责开发Android应用程序和第三方Android操作系统来延长和扩展Android的功能和性能。

[]

2.2Android系统框架

如图2-1所示Android系统架构为四层结构,从上层到下层分别是应用程序层、应用程序框架层、系统运行库层以及Linux内核层。

图2-1

Android系统的应用层主要是开发人员使用JAVA语言进行开发的一些具有特定功能的应用,如照相机,浏览器,短信发送程序以及一些小游戏等应用。

Android系统的应用框架层是开发人员从事Android开发的基础,很多核心应用程序也是通过这一层来实现其核心功能的,该层简化了组件的重用,开发人员可以直接使用应用框架层所提供的组件来进行应用程序开发,也可以通过重写而实现个性化的拓展。

Android系统的系统运行库层可以分成两部分,分别是系统库和Android运行时库。

其中系统库中主要的库有[]:

MediaFramework:

多媒体库,基于PacketVideoOpenCore;支持多种常用的音频、视频格式录制和回放,编码格式包括MPEG4、MP3、H.264、AAC、ARM。

SQLite:

小型的关系型数据库引擎。

OpenGL|ES:

根据OpenGLES1.0API标准实现的3D绘图函数库。

FreeType:

提供点阵字与向量字的描绘与显示。

WebKit:

一套网页浏览器的软件引擎。

SGL:

底层的2D图形渲染引擎。

Libc:

从BSD继承来的标准C系统函数库,专门为基于embeddedlinux的设备定制。

Android应用程序时库采用Java语言编写,程序在Android运行时中执行,其运行时分为核心库和Dalvik虚拟机两部分:

核心库:

提供了Java语言API中的大多数功能,同时也包含了Android的一些核心API,如android.os、、android.media等等。

Dalvik虚拟机:

Dalvik虚拟机是一种基于寄存器的Java虚拟机,而不是传统的基于栈的虚拟机,并进行了内存资源使用的优化以及支持多个虚拟机的特点。

Android系统的内核层是基于Linux2.6内核,其核心系统服务如安全性、内存管理、进程管理、网路协议以及驱动模型都依赖于Linux内核。

2.3Android优缺点

优点一:

开放性

Google公司将Android系统的源代码对外开放意味着允许任何移动终端厂商加入到Android联盟中来。

因为Android的开源,专业人士可以利用开放的源代码来进行二次开发,打造出个性化的Android。

例如中国的MIUI就是基于Android2.3原生系统深度开发的Android系统,其与原生系统相比有了较大的改动。

而且开放性可以缩短开发周期,降低开发成本。

如此一来跟有利于Android的发展

优点二:

用户自由度更高

Android操作系统给予了用户跟高的自由度,熟悉Android的都清楚:

用户可以根据自己的喜好来设置手机界面,Android的应用市场甚至上还有各式各样的启动器来供用户自己选择,让自己的手机与众不同。

例如,用户要是喜欢HTC的操作界面,便马上可以在应用市场上找到,甚至还能模仿IOS的界面。

相比于IOS操作系统,Iphone手机只有一成不变的手机界面,不能对其进行更改。

优点三:

大量Android应用程序

正是因为Android平台的开放性,吸引了大量的开发人员进行应用程序开发。

从而使android应用程序数量快速上升。

截止去年10月30日,Android应用首次超过ios应用达到71.3万.

缺点一:

安全问题

由于Android系统的开源以及快速的发展以及审核机制的不完善导致Android市场上出现了一些恶意软件。

2009年11月10日Android平台出现第一个恶意间谍软件:

Mobile Spy。

2010年8月12日,出现了第一个木马病毒:

Trojan-SMS.AndroidOS.FakePlayer.a[]。

在这些恶意软件的影响之下,用户的隐私不能得到充分的保障,在不经意间就可能泄露自己的隐私。

缺点二:

用户体验不一

因为Android系统的流畅运行需要硬件支持。

而手机厂商对于Android的定制多种多样,导致了一些高配置手机上Android的运行流畅度良好,而低配置手机运行缓慢。

缺点三:

程序平均质量不高

随着Android系统的开源,越来越多的手机厂商在智能手机上使用Android手机,Android手机应用开发者也越来越多,Android应用程序的数量也在快速上升。

但是Android程序开发者的开发水平难免良莠不齐。

在高端应用上,相较于苹果应用,Android应用程序因为其自身多为免费程序,许多应用功能强大Android应用程序的为了商业用途难免在应用程序中夹杂许多推送广告,引起人们的反感。

2.4Android编译环境搭建

2.4.1JDK安装与配置

在网页查看JDK版本信息,若显示版本信息则说明安装成功,若显示错误,请先确认环境变量是否设置。

以Windows7系统为例,假设JDK安装路径在C:

\ProgramFiles\Java\jdk1.6.0_31,进入计算机—>高级系统设置—>环境变量—>系统变量中

90点击新建,在变量名中输入classpath,变量值为C:

\ProgramFiles\Java\jdk1.6.0_31\lib\dt.jar;C:

\ProgramFiles\Java\jdk1.6.0_31\lib\tools.jar;

2.点击新建,在变量名中输入JAVA_HOME,变量值为C:

\ProgramFiles\Java\jdk1.6.0_31

3.找到path选项,在变量值后面添加C:

\ProgramFiles\Java\jdk1.6.0_31\bin记得用“;”和前面隔开。

配置完成后再输入java-version进行测试。

2.4.2eclipse安装与配置

进入http:

//www.eclipse.org/downloads/download.php?

file=/technology/epp/downloads/release/juno/SR2/eclipse-java-juno-SR2-win32.zip网页中并下载eclipse进行解压,解压后可直接使用,进入eclipse主界面在主界面上方点击help->InstallNewSoftware,点击add在name中随意输入名字,location中输入http:

//dl-tools下载并安装相应组件。

2.4.3SDK

在网上搜索并下载SDK,将其解压后的文件所在目录配置到菜单window->preferences->android->SDKlocation.,因为SDK可能存在过时,要进行文件更新才能正常使用。

点击eclipse界面的androidSDKManager,为了方便选择,将显示的所有安装文件选中并开始下载安装。

2.4.4创建AVD

因为android系统是建立在Linux操作系统基础上。

所以编写好的android程序不能直接在windows系统下运行。

因此我们需要搭建一个模拟的平台来测试安卓程序的运行。

在eclipse主界面选中androidvirtualdevicemanager,在显示的界面中点击new设置主要参数。

主要包括AVD的name,device,target(虚拟机的版本)。

其他参数当有需要时可以自行设定。

至此关于android开发的平台搭建完毕。

第3章算法解析

3.1算法理论介绍

在图像引导滤波算法中,首先明确一个概念,输出图像Q是输入图像P和引导图像I进行线性变换的结果。

输入图像P和引导图像I都是已知量,而且两者可以完全相同。

输入图像P的像素点i的值在经过处理之后生成一个加权平均数并成为输出图像Q的像素点i;

公式1

在本函数中,i和j都代表像素的索引,滤波核Wij是输入图像I的函数并且与P无关。

但是滤波器是与P线性相关的。

我们假设q是I在以像素K为中心的小窗口WK上进行线性变换的结果。

则有以下函数

公式2

其中(ak,bk)是在窗口Wk中恒定不变的线性参数。

我们使用一个半径为R的正方形窗口。

这个线性模型确保仅当引导图像I有边缘时q才有边缘。

因为:

∇q=a∇I。

这个模型已经在多个应用中证明是可行的比如,抠图,图像超分辨率,和清除迷雾。

  为了确定这些线性参数,我们寻找一种解决方案来最小化输出图像q和输入图像p之间的差别。

尤其的,我们列出下面的函数

公式3

在本函数中,ε是一个不变的参数用来防止ak的值过大,本函数通过计算得到答案

公式4

公式5

在上述函数中,

是引导图像I在窗口WK中的平均值,

是引导图像I在窗口WK的方差,

是在窗口WK里面的像素数目,

是p在窗口WK的平均值。

下面,我们将线性模型应用于整个图片中的局部窗口,然而像素I可能包含在许多WK中,所以在函数1中的值在不同窗口计算出来的值不相同。

一个简单的方法就是计算出所有qi可能值的平均数。

所以当计算出图片中每个模块的(ak.bk),我们计算输出滤波器

公式6

公式7

公式8

至此输出图像q的像素点i的值生成。

循环重复计算每个像素点,从像素点扩散到全图,就生成了输出图像q[]。

3.2算法java实现

众所周知图像格式多种多样,在本程序中,我们仅为了研究算法,不对图片格式进行细化分析。

暂时对以bmp为代表的彩色24位图片进行处理。

此类图片的存储方式可看为一个三维数组,其中变量i和j代表图片的像素的索引,当i,j确定时即可确定一个像素点k,k的值包括透明度alpha,红色值R,绿色值G蓝色值B,其中alpha,R,G,B都为0到255的整数,为了方便算法的实现,我们单独讲所有的R值,G值,B值取出来形成三个新的灰阶二维数组分别进行处理。

首先打开程序,点击按钮并浏览选择要优化的图片I。

程序中为了方便,将输入图像I与引导图像P设为同一张图的,既将输入图像I的值赋给引导图像P。

然后设定小窗口半径r为16(此处可发散开来让用户自己选择喜欢的半径,但不宜过大,)以及定义一个浮点型小数并赋值,该小数作用等同于上文公式中的ε。

首先将图片I,P中的数据提取成4个二维数组分别表示alpha值的数组,R值的数组,G值的数组,B值的数组,注意因为alpha值不参与运算,因此提取后不作处理。

下面以R值的二维数组运算过程来表现算法。

首先定义方法boxfilter该方法输入参数为一个浮点型二维数组a和一个整型r,返回值是一个浮点型的二维数组。

方法实现的功能是计算一个二维数组a在半径为r的小窗口的所有值之和sum,随着小窗口的移动,sum的值也不断发生变化,生成一个新的二维数组[]。

具体实现后文将会提到。

float[][]N=newBoxfilter().boxfilter(p,r);

//此时,数组N即函数4中|W|表示该窗口所有像素个数之和

float[][]mean_I=newOperation().Division(newBoxfilter().boxfilter(a,r),N);

//获得二维数组I在以r为半径大小的小窗口中的像素值平均数

float[][]mean_p=newOperation().Division(newBoxfilter().boxfilter(b,r),N);

//获得二维数组I在以r为半径大小的小窗口中的像素值平均数

float[][]mean_Ip=newOperation().Division(newBoxfilter().boxfilter(newOperation().multiplication(a,b),r),N);

float[][]cov_Ip=newOperation().subtraction(mean_Ip,newOperation().multiplication(mean_I,mean_p));

//获得二维数组I与P的协方差

float[][]mean_II=newOperation().Division(newBoxfilter().boxfilter(newOperation().multiplication(a,a),r),N);

float[][]var_I=newOperation().subtraction(mean_II,newOperation().multiplication(mean_I,mean_I));

//获得二维数组I在以r为半径大小的小窗口中的像素值方差

float[][]A=newOperation().Division(cov_Ip,newOperation().add(var_I,eps));

float[][]B=newOperation().subtraction(mean_p,newOperation().multiplication(A,mean_I));

//获取所有小窗口的值(a,b)所构成的二维数组A,B

float[][]mean_b=newOperation().Division(newBoxfilter().boxfilter(B,r),N);

float[][]q=newOperation().add_a(newOperation().multiplication(mean_a,a),mean_b);

//生成输出图像q

其中Boxfilter(double[][]I,r)方法实现效果是计算输入的参数二维矩阵I在以输入参数r为半径的小窗口中的所有值之和。

Operation()是定义的操作类,Division是定义的操作方法,表示行列相等的两个数组之间相应位置的值相除,a和b在这里分别表示传入方法的输入图像的R值二维数组与引导图像R值二维数组。

实际上,在此处存在一下关系:

float[][]mean_p=mean_I;

将以上代码分别与论文中参数对应起来就有:

mean_I对应

表示图像I在窗口Wk里的平均值。

mean_p对应

表示图像p在窗口Wk里的平均值。

Cov_IP对应

,表示图像I与图像P的协方差。

var_I对应

,表示I在窗口Wk里的方差。

A对应ak,B对应bk,q对应函数中的qi;

至此,图像引导滤波算法基本完成。

第4章仿真实验及分析

4.1程序演示及分析

在手机上启动照相机现场拍摄一张图片。

启动编写好的Myguidefilter应用。

选择刚才拍摄的图片并显示在手机屏幕上拖动滑动条,根据滑动条的移动手机屏幕将显示不同效果的照片。

算法结构图如下:

 

 

 

 

图3-1

下面四幅图是滑动条在滑动过程中生成的结果展示图。

图像增强核心计算公式是:

I_enhanced=(I-q)*progress+q;公式9

其中I_hancement是结果图片,I是输入图片,q是通过图像引导滤波算法生成图片,progress是滑动条滑动中产生的值。

很明显有以下结论:

当progress=1时,I_enhanced=I,输出图像为原图。

如图3-2;

当progress=0时,I_enhanced=q;输出图像为图像引导滤波输出图像。

如图3-3;

经多次测试,当progress=5,输出图像为增强图像。

如图3-4,此时给人的视觉效果最好。

若progress取值过大progress=10,输出图像为增强图像如图3-5,图像视觉效果反而降低。

图3-2图3-3

图3-4图3-5

4.2重难点及解决方案

在安卓上实现图像引导滤波算法中遇到了各种各样的问题,通过网上搜索解决方案和咨询同学解决了大部分,现在我将我在实现过程中所遇到的比较突出的重点难点展示出来:

重难点一:

如何将图像信息转换为数组并进行处理。

解决方案:

android开发环境中删除了java开发包中关于AWT的组件的许多功能。

因此不能使用原有java开发包中提供的getred()等方法,但是android同时提供了更符合android环境的开发工具包。

可调用android.graphics.Color包中Getpixel(j,i)[]方法获得当前图片索引(j,i)下的像素点的值,同时在调用Color.red(),Color.green(),Color.blue(),分别获取该像素值得R,G,B值,将其存放在image_R,image_G,image_B,三个二维数组中,从而完成对bmp位图的图像信息的提取与转换。

重难点二:

boxfilter()的功能实现

解决方案:

boxfilter()实现的功能是输入参数二维像素矩阵a[][],以及小窗口半径r,计算出二维矩阵在以像素点k为中心以r为半径的小窗口中的所有值之和。

在实现该功能的时候首先要确定一点,随着小窗口的k的变动,小窗口所包括的像素点值之和是在不断变化的,而且当像素点k接近二维像素矩阵所构成的边缘时,小窗口的半径也会发生变化,保持小窗口不会超出像素矩阵所构成的窗口中。

所以常规的做法是在四重嵌套for循环中分条件计算出最后值,也在网络上查询了相关信息,尝试过使用积分图[]来实现该方法,但是失败了。

后来将论文附带的boxfilter.m文件翻译之后,自己编写方法逐条实现文件中的代码,最后成功将M文件中的功能实现并用java语言编写出来。

重难点三:

用算法处理之后的矩阵转换为图片。

解决方案:

和重难点一类似,android中都提供了类似的方法可供开发人员调用,查询相应的API可以获得方法细节。

但是实际处理是存在一个问题,经过算法计算出来的像素值存在为负或大于1的情况。

而android开放的API中只有使用范围是0-255的整形值才能反向生成某一具体像素点的color值,通过每个像素乘以255然后强制转换成整形,并将大于255的值全部设为255,小于0的像素值全部设为0,这样在存在误差的情况下总体上保证了程序功能的实现。

重难点四:

内存不足,数组计算耗时较久

解决方案:

当程序大致完成主要功能之后运行时发现因为图片过大,同时一些必要的数组计算产生的中间变量及结果变量浪费大量内存,而java自身的内存回收机制使他没有像C/C++那样使用指针直接对内存进行控制。

还有一点就是android系统给每个程序运行所能占用的最大内存值设定了上限为8M,因此运行处理较大的图片会十分吃力。

对此我将程序中牵涉到的二维数组全部用一位数组替换。

并仅在界面中显示缩略图。

但是运行速度缓慢的解决方案任然没有找到。

大致猜想是使用android原生C开发方法,直接用android调用已完成方法功能的C函数以避免java语言内存分配机制的弊端。

4.3关键代码

4.3.1读取图像及压缩显示

buttonLoadImage.setOnClickListener(newView.OnClickListener(){

publicvoidonClick(Viewarg0){

Intenti=newIntent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);

startActivityForResult(i,RESULT_

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2