有理三角Bezier曲面片和有理矩形曲面片的转化

有理三角Bezier曲面片和有理矩形曲面片的转化[20191209140651]
摘 要
本论文旨在设计一个在Linux系统下使用的放大镜应用程序。阐述了Linux系统的发展历史,Linux系统的重要作用以及其应用领域。介绍了Linux下的应用软件开发工具Qt,及基于面向对象语言C++,容易扩展,允许组件编程。
本文分三个模块:图像数据采集模块,图像数据处理模块和图像数据输出模块。其中,关键部分是图像数据处理模块,采用的算法分别是最临近点插值算法和双线性插值算法,通过使用这两种不同的算法,来实现图像不同程度的放大要求。
 查看完整论文请+Q: 351916072 
关键字:放大镜图像处理Linux系统
目录
1. 引言1
1.1 Linux系统的发展历史及其特点1
1.2 研究Linux系统的目的与意义2
2. 放大镜设计的需求分析3
2.1 Linux系统的概况3
2.2 需要的技术支持3
2.3 实现功能的划分3
3. 放大镜的概要设计5
3.1 功能设计的概述5
3.2 模块划分5
3.2.1 图像数据采集模块5
3.2.2 图像数据处理模块6
3.2.3 图像数据输出模块7
4. 放大镜的详细设计8
4.1 详细设计的概述8
4.2 采集模块的设计8
4.3 处理模块的设计9
4.4 输出模块的设计16
5. 结语18
参考文献19
致谢20
1. 引言
在这科学技术飞速发展的时代,尤其是电子产业的发展,使得计算机的应用领域不断扩大,而计算机本身也得到了不断提升。
大存储量、处理能力强的手持设备,凸显出了强劲的发展势头。掌上电脑、第三代手机等皆是手持设备[1],在这几年的发展中,不断出现新的成就,越来越方便人们的日常生活。Linux系统[2],作为四大主流操作系统中的一员,在手持设备的发展中演绎着重要的角色。Linux系统受到了人们越来越多的关注,这归功于其代码资源丰富、开放的源码、可移植性比较好等。
计算机中的放大镜是为了观察计算机中细微的不易辨析的文字或图片而设计的。有了放大镜程序,计算机的功能将更加完善,计算机的使用者能够观察到其中更加细微的变化。通过此次的开发,设计出一个在Linux系统下能够方便使用的放大镜程序,起到放大图片和文字的作用,为Linux系统的桌面应用添加实用的工具。Windows系统有着自己的放大镜程序,但是Linux系统并没有此程序,因此设计一个Linux系统下的放大镜程序是很有意义的。同时,通过此次设计,对Linux系统有着更加深入的了解,同时也是巩固和加深以C++为基础的面向对象编程技术。
1.1 Linux系统的发展历史及其特点
从第一台计算机的诞生到10亿人上网花费了仅仅50多年时间。而Linux系统也只是用了十年时间,就从出现走向了成熟。计算机行业的更新速度让人震惊。自1991年Linux系统的出现,它就在桌面系统和服务器中以惊人的速度占据重要地位,体现出系统功能的强大与完善。Linux系统的高效性和灵活性,使其应用领域十分广泛,因此它被业内人士认为是最有前途的操作系统之一。更加突出的是,Linux系统在嵌入式行业显示了其极大的优势,开放源码,可移植性好,系统稳定等,赢得众多开发人员的青睐。目前,比较热门的智能家居设计,就是嵌入式产品的典型。
Linux系统的出现,也是让人相当的称赞。一位名叫LinusTorvalds的学生,他的想法十分简单,设计一个既有Uinux系统的完整功能[3],还要能替代Minix的操作系统,由此,诞生了Linux系统。Linux系统刚刚出现,就受到了开发人员和众多计算机爱好者的喜爱。Linux系统两个主要原因,导致它受到如此的欢迎,一是软件自由,用户可以按照自身的需要裁剪源代码,设计出自己需要的程序来。二是它拥有Unix系统的完整功能,即使是以前没有使用过Linux系统,但是只要是接触过Unix系统,就能很容易操作Linux平台。Linux系统的一大特点是多平台性,也就是说Linux系统可以在多种硬件平台运行上,比如x86、SPARC、680x0等处理器上。可以看出,Linux系统有着诸多的优势和良好的发展前景,难怪有那么多的开发人员和厂商投身于Linux领域的开发和生产中。
1.2 研究Linux系统下放大镜设计的目的和意义
图像数据的处理,是本次设计的关键所在,也是放大镜实现放大功能的前提。通过对放大镜实现功能的具体分析,选择了两种比较适合的插值算法[4]。一种是最临近插值算法,另外一种是双线性插值算法。这两种算法各有自身的优点,前者是处理数据的速度比较快,后者是数据处理的结果比较准确。因此,根据不同的需求,设计出两种不同类型的放大镜,一次满足用户的放大需求。此次的放大镜设计,是对Linux系统更加深入的学习和理解,掌握Linux系统的开发方法,对于今后自身的开发技术的提高很有帮助。在Linux系统中,与Windows系统最大的区别是一切皆是文件,对于系统内核来说,无论是软件、进程等,都被看作是文件。总的来看,使用Linux的用户可以按照自己的意愿修改源码,对于从事开发开发行业的人来说,有着极大的好处。学习Linux系统,使得自己对操作系统,开发工具,开发语言等都会有这更加深入的了解,对今后的开发工作十分有促进意义。因此,学习在Linux系统下开发应用程序,一方面是对系统、语言等的进一步研究,另一方面也是把自己所学到的知识运用到开发中,检验自身的学习成果。
2.放大镜设计的需求分析
2.1 Linux系统的概况
开源软件的影响力在不断增强,在世界范围内,Linux系统于桌面、服务器、行业制定等领域得到了长久的发展,特别在服务器行业,更是占据重要地位。
Linux内核2.6的出现,展现了Linux系统的重大进步,是其走向成熟和稳定的标识。如今,虽然Linux系统版本繁多,但是不同版本内核是相同的,这也是Linux实行标准化、互换性的基础。
在服务器方面,由于IBM和因特尔等公司的鼎力支持,Linux系统取得了长期有效的发展。电子商务在近年来的发展中不断的扩大,越来越多的用户和厂商开始重视Linux系统的桌面技术。目前,比较有开发价值的桌面技术是:3D桌面,桌面搜索技术,桌面友好性。不得不承认,Linux系统正在逐步走向计算机中的各个领域,以其独特的优势,占据着主导地位。
2.2 需要的技术支持
此次开发,使用的开发工具是跨平台开发框架Qt。Qt提供了一种安全的类型称为信号与槽机制(signals/bits)[5],用它代替了callback,达到了安全传递信号的功能。Qt的专注点在于C++图形界面开发,它的优点在于面向对象、跨平台性等。Qt支持Windows,Linux,SCO等众多的操作系统,体现了其良好的跨平台的特性。大量的API文档,丰富的C++类包,这是Qt开发的优势所在,也是开发人员迫切需要的。开发人员可以从文档中了解Qt技术的使用方法,使用已存在的C++类,来简化开发过程。
像Google Erath(三维地图虚拟软件)、stellarium(天文学自由软件)等,都是用Qt开发出来的。使用Qt Creator作为此次开发的工具,对于了解Qt的作用,开发的流程,以及Qt中工具的使用,很有帮助。使用Qt开发,利用Qt自身优势,开发出一款满意的放大镜程序。
2.3 实现功能的划分
此次设计,把放大镜程序分成了两个部分,一个是“圆形”,一个是“方形”。所谓“圆形”和“方形”是按照最终设计结果来命名的。“圆形”是指模拟真实的放大镜,设计出能够即时放大文字或图片的程序,此窗体的外观和普通放大镜一样,因此称为“圆形”。“方形”放大镜,实际上是一个方形窗体,窗体悬浮在桌面上,窗体中显示的内容随着鼠标位置的不同而改变。之所以分为“圆形”和“方形”,是从算法效率上考虑。最临近点插值算法运行效率高于双线性插值算法,但是其放大的图片不如后者清晰。因此,用前一种插值算法来实现“圆形”放大,就是即时放大功能,用后一种插值算法来实现“方形”放大,即有效放大。
3. 放大镜的概要设计
3.1 功能设计的概述
放大镜的设计,实现的功能是放大桌面某一部分的图片或者文字,能够让使用者观察到计算机屏幕中细微的图像。具体的实现原理是,获取鼠标所在位置的图像,并把图像数据放到缓存中[6],然后利用缓存中的数据,通过相应的放大函数处理数据使得图片放大,最后显示到设计好的窗体中。
此次的放大镜设计,可以有两种划分模式,一个是按照功能划分,那么可以划分成三个模块:图像数据采集模块、图像数据处理模块、图像数据输出模块。系统功能划分如图3.1所示。如果是按照放大镜实现放大的技术上划分,可以分成两个部分,即“圆形”部分和“方形”部分。在此,我选择了使用第一种方式来描述,因为它更加贴近软件开发的设计模式。
图 3.1 系统功能模块划分图
3.2 模块划分
3.2.1 图像数据采集模块
此模块的功能是获取当前屏幕任意区域的图像数据。程序设计的大概流程如下:
(1)建立起数据连接,开启数据集;
(2)初始化列表,使得列表的显示条件符合数据记录的要求
(3)遍历数据集中的数据,把数据加到列表中
(4)断开数据集,断开数据连接
在这图像数据的采集过程中,使用到的方法如下:
QWidget *desktop = reinterpret_cast(QApplication::desktop());
mCapturePixmap = QPixmap::grabWindow(desktop->winId());
这里reinterpret_cast(QApplication::desktop())方法的作用是定义了一个指向流的指针[7],管理图形界面中用户应用控制流。使用QPixmap类中grabWindow()方法读取图像的数据流。调用这两种方法,获取指定图片的数据,保存在临时变量中,用于对数据的进一步处理。
3.2.2 图像数据处理模块
按照要求处理得到的图像数据,实现不同放大。选择什么样的放大方法,如何放大,这个就决定了图片在最后放大后时质量,以及放大的形式的不同。但是这两种方法有着共同的功能,那就是获取图像数据,进行放大处理。需要具体分析的是,两种放大方法的算法设计。
第一种是最临近点插值算法:
最临近点插值算法是一种简单而有快速的插值算法。通过把目标图片上的未知像素点,映射到原始数据上,和原始影像上4个与其相邻的像素点进行比较,把最接近未知像素点的值作为目标图片中未知像素点的值。如图3.2所示:p最接近D点,于是p的像素值就是D点像素值
图 3.2 最临近点插值算法示意图
最临近点插值算法的公式如下:
(1)
公式(1)中, 表示的是输出图像中坐标是 位置的像素点颜色值。 表示的是输入图像中坐标是 处的像素点颜色值。
第二种是双线性插值算法:
使用双线性插值是放大后的图片质量比较高,就是计算量有点大。不过,与最临近插值算法相比,不会出现像素点不连续的状况。图3.3是其示意图:
图 3.3 双线性插值算法示意图
其公式如下:
(2)
在该公式中,i,j代表了像素点的位置,比如原图中(i,j)的像素值用f(i,j)来表示。
3.2.2 图像数据输出模块
输出模块的作用比较简单,主要的作用就是实现放大后的数据流输出的功能。该模块使用了独立的输出方法,即重写了QPainter类中的PaintEvent()方法[8],绘画出放大后的图片。这样写的好处是,可以根据自身需要,随时调用绘画方法,显示放大后的图像。
4. 放大镜的详细设计
4.1 详细设计的概述
之前,已经讲述了论文设计的实现方法,接下来要做的是进行详细设计,最终完成放大镜的设计工作。首先,先看一下放大镜设计的主界面,如图4.1所示。

版权保护: 本文由 hbsrm.com编辑,转载请保留链接: www.hbsrm.com/jsj/rjgc/2043.html

好棒文