版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、linux下的放大镜的设计与实现摘要本论文旨在设计一个在linux系统下使用的放大镜应用程序。阐述了 linux系统的发 展历史,linux系统的重要作用以及其应用领域。介绍了 linux下的应用软件开发工具qt, 及基于面向对象语言c+,容易扩展,允许组件编程。本文分三个模块:图像数据采集模块,图像数据处理模块和图像数据输出模块。其中, 关键部分是图像数据处理模块,采用的算法分别是最临近点插值算法和双线性插值算法, 通过使用这两种不同的算法,来实现图像不同程度的放大要求。关键词:放大镜图像处理linux系统design and implementation of a magnifying g
2、lass under linuxabstractthe main point of this essay was to design a magnifier application which used under linux system.explained the history,vital function and application about linux.i introduced a application software development tool一qt.which is based on object oriented language c+,is easily ex
3、pended and accepted component programming.the program is divided into three modules: image data capturejmage data processing and image data output.the key part is image data processing among these modules, which i adopted two different algorithms that they are nearest neighbor interpolation and bili
4、near interpolation algorithm .by using the two different algorithms,the various degree of amplification requirements is realizedkey words:magnifying glass; image data processing; linux system1引言在这科学技术飞速发展的时代,尤其是电子产业的发展,使得计算机的应用领域不断 扩大,而计算机本身也得到了不断提升。大存储量、处理能力强的手持设备,凸显出了强劲的发展势头。掌上电脑、第三代手 机等皆是手持设备,在这几
5、年的发展中,不断出现新的成就,越来越方便人们的口常生 活。linux系统,作为四大主流操作系统中的一员,在手持设备的发展中演绎着重要的角 色。linux系统受到了人们越來越多的关注,这归功于其代码资源丰富、开放的源码、可 移植性比较好等。计算机中的放大镜是为了观察计算机中细微的不易辨析的文字或图片而设计的。有了 放大镜程序,计算机的功能将更加完善,计算机的使用者能够观察到其中更加细微的变化。 通过此次的开发,设计出一个在linux系统下能够方便使用的放大镜程序,起到放大图片 和文字的作用,为linux系统的桌面应用添加实用的工具windows系统有着自己的放人 镜程序,但是linux系统并没有
6、此程序,因此设计一个linux系统下的放大镜程序是很有 意义的。同i寸,通过此次设计,对linux系统有着更加深入的了解,同时也是巩固和加深 以c+为基础的面向对象编程技术。1. 1 linux系统的发展历史及其特点从第一台计算机的诞生到10亿人上网花费了仅仅50多年时间。而linux系统也只是 用了十年时间,就从出现走向了成熟。计算机行业的更新速度让人震惊。自1991年linux 系统的岀现,它就在桌面系统和服务器中以惊人的速度占据重要地位,体现岀系统功能的 强大与完善。linux系统的高效性和灵活性,使其应用领域十分广泛,因此它被业内人士 认为是最有前途的操作系统之一。更加突出的是,lin
7、ux系统在嵌入式行业显示了其极大 的优势,开放源码,可移植性好,系统稳定等,赢得众多开发人员的青睐。目前,比较热 门的智能家居设计,就是嵌入式产品的典型。linux系统的出现,也是让人相当的称赞。一位名叫linustorvalds的学生,他的想 法十分简单,设计一个既有uinux系统的完整功能,还要能替代minix的操作系统,由此, 诞生了 linux系统。linux系统刚刚出现,就受到了开发人员和众多计算机爱好者的喜爱。 linux系统两个主要原因,导致它受到如此的欢迎,一是软件自由,用户可以按照自身的 需要裁剪源代码,设计出自己需要的程序来。二是它拥有unix系统的完整功能,即使是 以前没
8、有使用过linux系统,但是只要是接触过unix系统,就能很容易操作linux平台。 linux系统的一大特点是多平台性,也就是说linux系统可以在多种硬件平台运行上,比 如x86、sparc、680x0等处理器上。可以看出,linux系统有着诸多的优势和良好的发展 前景,难怪有那么多的开发人员和厂商投身于linux领域的开发和生产中。1.2研究linux系统下放大镜设计的目的和意义图像数据的处理,是本次设计的关键所在,也是放大镜实现放大功能的前提。通过对 放大镜实现功能的具体分析,选择了两种比较适合的插值算法。一种是最临近插值算法, 另外一种是双线性插值算法瞪】。这两种算法各有自身的优点,
9、前者是处理数据的速度比较 快,后者是数据处理的结果比较准确。因此,根据不同的需求,设计出两种不同类型的放 大镜,一次满足用户的放大需求。此次的放大镜设计,是对linux系统更加深入的学习和 理解,掌握linux系统的开发方法,对于今后自身的开发技术的提高很有帮助。在linux 系统中,与windows系统最大的区别是一切皆是文件,对于系统内核来说,无论是软件、 进程等,都被看作是文件。总的来看,使用linux的用户可以按照自己的意愿修改源码, 对于从事开发开发行业的人来说,有着极大的好处。学习linux系统,使得自己对操作系 统,开发工具,开发语言等都会有这更加深入的了解,对今后的开发工作十分
10、有促进意义。 因此,学习在linux系统下开发应用程序,一方面是对系统、语言等的进一步研究,另一 方面也是把自己所学到的知识运用到开发中,检验自身的学习成果。2. 放大镜设计的需求分析2. 1 linux系统的概况开源软件的影响力在不断增强,在世界范圉内,linux系统于桌面、服务器、行业制 定等领域得到了长久的发展,特别在服务器行业,更是占据重要地位。linux内核2.6的出现,展现了 linux系统的重大进步,是其走向成熟和稳定的标识。 如今,虽然linux系统版本繁多,但是不同版本内核是相同的,这也是linux实行标准化、 互换性的基础。在服务器方面,由于ibm和因特尔等公司的鼎力支持,
11、linux系统取得了长期有效的 发展。电子商务在近年来的发展中不断的扩大,越来越多的用户和厂商开始重视linux系 统的桌面技术。目前,比较有开发价值的桌面技术是:3d桌面,桌面搜索技术,桌面友好 性。不得不承认,linux系统正在逐步走向计算机屮的各个领域,以其独特的优势,占据 着主导地位。2. 2需要的技术支持此次开发,使用的开发工具是跨平台开发框架qt。qt提供了一种安全的类型称为信 号与槽机制(signals/bits) lh1,用它代替了 callback,达到了安全传递信号的功能。qt的专 注点在于c+图形界面开发,它的优点在于面向对彖、跨平台性等。qt支持windows, lin
12、ux, sco等众多的操作系统,体现了其良好的跨平台的特性。大量的api文档,丰富的c+ 类包,这是qt开发的优势所在,也是开发人员迫切需要的。开发人员可以从文档中了解qt 技术的使用方法,使用已存在的c+类,来简化开发过程。像google erath (三维地图虚拟软件)、stellarium (天文学自由软件)等,都是用qt 开发出来的。使用qtcreato?101作为此次开发的工具,对于了解qt的作用,开发的流程, 以及qt中工具的使用,很有帮助。使用qt开发,利用qt自身优势,开发出一款满意的 放大镜程序。2. 3实现功能的划分此次设计,把放大镜程序分成了两个部分,一个是“圆形”,一个
13、是“方形”。所谓“圆 形”和“方形”是按照最终设计结果来命名的。“圆形”是指模拟真实的放犬镜,设计出 能够即时放大文字或图片的程序,此窗体的外观和普通放大镜一样,因此称为“圆形”。“方 形”放大镜,实际上是一个方形窗体,窗体悬浮在桌面上,窗体中显示的内容随着鼠标位 置的不同而改变。之所以分为“圆形”和“方形”,是从算法效率上考虑。最临近点插值 算法运行效率高于双线性插值算法,但是其放大的图片不如后者清晰。因此,用前一种插 值算法来实现“圆形”放大,就是即u寸放大功能,用后一种插值算法来实现“方形”放大, 即有效放大。3. 放大镜的概要设计放大镜的设计,实现的功能是放大桌而某一部分的图片或者文字
14、,能够让使用者观察 到计算机屏幕中细微的图像。具体的实现原理是,获取鼠标所在位置的图像,并把图像数 据放到缓存中,然后利用缓存中的数据,通过相应的放大函数处理数据使得图片放大, 最后显示到设计好的窗体中。此次的放大镜设计,可以有两种划分模式®, 个是按照功能划分,那么可以划分成 三个模块:图像数据采集模块、图像数据处理模块、图像数据输出模块。系统功能划分如 图3所示。如果是按照放大镜实现放大的技术上划分,可以分成两个部分,即“圆形” 部分和“方形”部分。在此,我选择了使用第一种方式来描述,因为它更加贴近软件开发 的设计模式。图3.1系统功能模块划分图3. 2模块划分3. 2. 1图像
15、数据采集模块此模块的功能是获取当前屏幕任意区域的图像数据。程序设计的大概流程如下:(1) 建立起数据连接,开启数据集;(2) 初始化列表,使得列表的显示条件符合数据记录的要求(3) 遍历数据集中的数据,把数据加到列表中(4) 断开数据集,断开数据连接在这图像数据的采集过程中,使用到的方法如下:qwidget desktop = reinterpret_cast<qwidget*>(qapplication:desktop(); mcapturepixmap = qpixmap:grabwindow(desktop->winid();这里 reinterpret_cast<
16、;qwidget*>(qapplication:desktop()方法的作用是定义了一个指 向流的指针,管理图形界面中用户应用控制流。使用qpixmap类中grabwindow()方法读 取图像的数据流。调用这两种方法,获取指定图片的数据,保存在临时变量中,用于对数据的进一步处理。3.2.2图像数据处理模块按照要求处理得到的图像数据,实现不同放大。选择什么样的放大方法,如何放大, 这个就决定了图片在最后放大后吋质量,以及放大的形式的不同。但是这两种方法有着共 同的功能,那就是获取图像数据,进行放大处理。需要具体分析的是,两种放大方法的算 法设计。第一种是最临近点插值算法:最临近点插值算法
17、是一种简单而有快速的插值算法。通过把目标图片上的未知像素 点,映射到原始数据上,和原始影像上4个与其相邻的像素点进行比较,把最接近未知像 素点的值作为目标图片中未知像素点的值。如图3.2所示:p最接近d点,于是p的像素 值就是d点像素值图3.2最临近点插值算法示意图最临近点插值算法的公式如下:(1)公式(1)中,表示的是输出图像中坐标是位置的像素点颜色值。表示的是输入图像 中坐标是处的像素点颜色值。第二种是双线性插值算法:使用双线性插值是放大后的图片质量比较高,就是计算量有点大。不过,与最临近插 值算法相比,不会出现像素点不连续的状况。图3.3是其示意图:图3.3双线性插值算法示意图其公式如下
18、:(2)在该公式中,i, j代表了像素点的位置,比如原图屮(i,j)的像素值用f(i,j)来表示。3.2.2图像数据输出模块输出模块的作用比较简单,主要的作用就是实现放大后的数据流输出的功能。该模块 使用了独立的输岀方法,即重写了 qpainter类中的paintevent()方法,绘画出放大后的图片。这样写的好处是,可以根据自身需要,随时调用绘画方法,显示放大后的图像。4. 放大镜的详细设计4. 1详细设计的概述之前,己经讲述了论文设计的实现方法,接下来要做的是进行详细设计,最终完成放 大镜的设计工作。首先,先看一下放大镜设计的主界面,如图4.1所示。图4. 1放大镜的主界面在这个界面中,有
19、两个按钮,命名是“圆形”,“方形”。若点击了 “圆形”按钮之后, 出现形状是圆形的放大镜,这个就是那个简易放大镜。若是点击了 “方形”按钮之后,出 现的方大镜是方形的,这个就是那个清晰放犬镜。需要注意的是,这两个放犬镜并不能同 时出现,一次只能出现一个。述有就是,子窗口的启动运用到了进程qprocess类。此时, 子窗口运行于独立的进程中,如果只是简单的通过关闭按钮关闭子窗口,那么该进程并没 有结束,最后可能会成为孤儿进程。因此,为了避免此类现象的发生,采用了主动杀死 进程的方法。当用户希望退出当前子窗口时,再点击一下父窗口屮的按钮,那么子窗口进 程将会被结束掉,子窗口将会退出。4. 2采集模
20、块的设计采集模块主要的作用是采集鼠标所在处的屏幕图像数据。实现方式如下面所给的代码:void magnifierwidget:moveevent(qmoveevent *event)获取鼠标所在位置的图片信息qpixmap drawpix = mcapturepixmap.copy(pos().x(),pos().y(),width(),height(); source = drawpix.tolmage(); /把图片转换成qlmage形式 dest = source;mfilter->filter(source,dest,source.rect();mdraw->repaint
21、(); /重绘图片return qwidget:moveevent(event); /返回鼠标点击事件该方法的调用是在数据连接已经建立的基础上使用的。该方法在获得图像数据后,首 先做的事情是把图像的格式进行转化,把它转化成qlmage形式,接着调用mfilter对象中 的filter()方法,是实现图像数据的放大处理。4. 3处理模块的设计图像数据处理模块可以说此次放大镜设计的核心部分,它实现了两种不同的放大功 能。按照用户不同的需求,采用不同的放大算法执行图片放大。“圆形”部分:在这个部分里,使用的是最临近点插值算法,满足用户即时放大的需求。该插值算法 的优点在运行效率快,但是缺点也很明显,
22、放大后的图片有的地方像素点不连续,清晰度 不是很高。其屮,主要的实现方法如2bool magnifierfi 1 ter:fi 1 ter(const qlmage & source,qlmage & dest?qrect region)for(int i = region.left();i < region.right();i+)for(int j = region.top();j < region.bottom();j+)int x = mmatrixx->getdata(i j); int y = mmatrixy->getdata(ij);设置(
23、i, j)的像素点 dest.setpixel(ij,source.pixel(x,y);return true;上述方法实现的功能是调用最临近点插值算法的方法函数,通过索引(x, y)把源图 片中相应坐标处的像素点放置到目标图像中,实现图像的放大。而其中最临近点插值算法 的实现方法的核心代码展示如下,for(int h = 0;h < mheight;h+)int position = h * mwidth;tmpprogress = qreal(h+1 )/(qreal)mheight; if(tmpprogress < floorprogress | tmpprogress
24、> upprogress)progressy = measingcurve.valueforprogress(tmpprogress); valuey = mheight * progressy;elseprogressy = (progressdived) *(tmpprogress - floorprogress) + progressfromfloor ;valuey = mheight * progressy;for(int w = 0;w < mwidth;w+)tmpprogress = qreal(w+1 )/(qreal)mwidth;if(tmpprogress
25、< floorprogress | tmpprogress > upprogress) progressx 二 measingcurve.valueforprogress(tmpprogress); valuex = mwidth * progressx;elseprogressx = (progressdived) *(tmpprogress - floorprogress) + progressfromfloor;valuex = mwidth * progressx;dataxposition + w = valuex;datayposition + w = valuey;“
26、方形”部分:在此部分中,利用双线性插值算法,实现图像的放大要求。由于双线性插值算法计算 时间长,所以满足不了即时性的要求。但是,该算法放大的图片清晰度高,能够观察细小 的变化。该算法实现的核心代码如下,void piczoom_bilinear2(const tpixels32ref& dst, const tpixels32ref& src) if ( (0 = dst.width) | (0 = dst.height)|(0 = src.width) | (0 = src.height) return;long xrintfloat_16 = (src.width)
27、71; 16)/dst.width + 1;long yrintfloat_16 = (src.height) « 16)/dst.height + 1;const long csderrorx = -(1 « 15) + (xrintfloat_16 » 1);const long csderrory = -(1 « 15) 4- (yrintfloat_16 » 1);long dst_width = dst.width;/y0 + y * yr >= 0; yo = csderrory => y >= -csderror
28、y/yrlong border_yo = -csderrory/yrintfloat_ 16 + 1;if (border_yo >= dst.height) border_yo = dst.height;long border_x0 = -csderrorx/xrintfloat_ 16 + 1;if (border_xo >= dst.width ) border_x0 = dst.width;/y0 + y * yr <= (height - 2) => y <= (height - 2 - csderrory)/yrlong border_y 1 = (s
29、rc.height - 2) « 16) csderrory)/yrintfloat_ 16 + 1;if (border_y 1 < border_yo) border_y 1 = border_yo;long border_x 1 = (src.width - 2) « 16) - csderrorx)/xrintfloat_16 + 1; 讦(border_xl < border_xo) border_x 1 = border_xo;color32 * pdstline = dst.pdata;long src_byte_width = src.byte_
30、width;long srcy_ 16 二 csderrory;long y;for (y = 0;y < border_yo; +y)long srcx_!6 二 csderrorx;for (long x = 0;x < dst_width;+x)bilinear2_border(src , srcx_ 16 , srcy_ 16 , &pdstlinex); /border srcx_16 + 二 xrintfloat_16;srcy_ 16 + 二 yrintfloat_16;(uint8*&)pdstline) += dst.byte_width;for
31、(y = border_yo;y < border_y 1 ;+y)long srcx_16 = csderrorx;long x;for (x = 0;x < border_xo;+x)bilinear2_border(src , srcx_ 16 , srcy_16 , &pdstlinex);/border srcx_16 += xrintfloat_16;unsigned long v_8 = (srcy_ 16 & oxffff) » 8;color32 * psrclinecolor =(color32*)(uint8*)(src.pdata)
32、 + src_byte_width:j(srcy_l 6 » 16);for (long x = border_xo;x < border_x 1 ;+x)color32 * pcoloro = &psrclinecolorsrcx_l6 » 16;color32 * pcolorl = (color32*)(uint8*)(pcoloro) + src_byte_width);bilinear2_fast(pcoloro , pcolorl ,(srcx_16 & oxffff) » &v_&&pdstlinefx)
33、;srcx_ 16 + 二 xrintfloat_16;for (x = border_x 1 ;x < dst_width;+x)bilinear2_border(src , srcx_ 16 , srcy_ 16 , &pdstlinex);/border srcx_16 + 二 xrintfloat_16;srcy_16 + 二 yrintfloat_16;(uint8*&)pdstline) += dst.byte_width;for (y = border_y 1 ;y < dst.height;+y)long srcx_16 = csderrorx;for (long x = 0;x < dst_width;+x)bilinear2_border(src , srcx_16 , srcy_16 , &pdstlinex); /border srcx_16 += xrintfloat_16;srcy_16 + 二 yrintfloat_
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2027届锡林浩特市数学四年级第一学期期末调研试题含解析
- 2027届长子县三上数学期末联考模拟试题含解析
- 2026麻醉科三基理论试卷测试题及答案
- 2027届山东省日照市东港区、开发区数学四年级第一学期期末综合测试试题含解析
- 江苏地区2027届数学四年级第一学期期末复习检测试题含解析
- 2027届上饶市鄱阳县数学四上期末质量跟踪监视试题含解析
- JJF(蒙) 111-2025 数字钳形万用表校准规范
- 2025-2026学年随州市高三一诊考试生物试卷含解析
- 2026届鹤岗市高考考前模拟生物试题含解析
- 2026中国涡流泵企业品牌价值评估与提升路径研究报告
- 机电设备安装项目施工进度计划模板
- 初一语文课文必背古诗词
- 2026年工业机器人公司销售业绩考核与提成核算管理制度
- 深度解析(2026)《YBT 4233-2010高炉冷风放风阀》
- GB/T 7582-2025声学听阈与年龄和性别关系的统计分布
- 2022年数学建模国赛C题 基于随机森林模型的古代玻璃制品成分分析与鉴别
- 娃娃机投放协议书
- 榴莲合作协议合同范本
- 消防验收协议合同范本
- 云仓代发货合同协议
- 钢管架搭建 合同范本
评论
0/150
提交评论