- 相关推荐
图像效果算法设计(一)
随着电影特效处理,广告平面设计等行业的兴起,图像处理软件成为众行业一个不可或缺的角色。为了进一步了解该行业软件的特性,实现思想和方法,故制作了这个以图像算法设计为主的软件。
本软件参考了adobe公司的photoshop的部分图像处理功能,在编写效果代码时主要运用了矩阵运算,还有求平均值,求差值等方法。这个软件是针对pf24bit的位图,利用其每个像素点都包含3个字节的原理,对其3个字节进行数学运算来实现图像算法。另外适当添加了一些看图辅助功能,并结合delphi的BussinessSkinForm控件大大美化了界面。
本文主要介绍了在delphi中,利用各种不同的算法来实现建立在位图上的不同效果,其中主要介绍的有曝光、浮雕、马赛克、模糊、锐化、添加杂色、喷溅、霓虹、90度旋转、水平翻转、垂直翻转。另外还做了当步撤销和图像的缩放,还有简单的jpg,bmp的格式转换。
[关键词]:图像处理,算法设计,BussinessSkinForm
Picture effect algorithm design
-static state effect
Abstract
Along with movie special effect processing and advertisement plane design profession starting, picture processing software becomes a numerous professions indispensable role. In order to further understands the characteristic , the realization thought and the method to this kind of profession software,whifhfdhfdgdfch is by the picture algorithm design primarily.
This software has referred to the partial pictures processing function of adobe Corporation's software which name is photoshop. When compilation effect code, mainly has utilized the mathod of matrix operation,Computation Mean value and different value. This software is aims at pf24bit the position chart, uses its each pixel all to contain 3 bytes the principles, carries on mathematics to its 3 bytes to operate realizes the picture algorithm.Moreover suitably increased some map-read assistance functions, and unified delphi BussinessSkinForm Controls to greatly beautify the surface.
This article mainly introduced in delphi, uses each different algorithm to realize the establishment to reign on the chart different effect, mainly introduces has the exposure, the relief, the mosaic, is fuzzy varicolored, the peaking, the increase, splatters, the neon, 90 revolves, the level turn over, the vertical turn over. Moreover also did has worked as step of cancellation and picture 缩放, but also had simple jpg, the bmp format conversion.
[Key word]: Picture processing, algorithm design, BussinessSkinForm
目 录
第1章 引言………………………………………………………………………4
1.1 课题背景……………………………………………………………………4
1.2 研究课题的任务、目的和意义……………………………………………4
1.3 系统的主要功能与特色……………………………………………………5
第2章 系统需求分析………………………………………………………….…7
2.1 本课题研究现状分析………………………………………………………7
2.2 要解决的技术难点及解决方法……………………………………………7
2.3 系统设计的主要内容、目标………………………………………………8
2.4 系统开发的环境和工具……………………………………………………9
第3章 系统详细设计与主要算法………………………………………………10
3.1 系统的体系结构和功能设计……………………………………………...10
3.2 系统各个模块的设计思路及实现方法…………………………………...12
3.2.1 主窗体程序模块……………………………………………………. 12
3.2.2 图像处理模块………………………………………………………..15
3.2.3 效果参数程序模块…………………………………………………..19
3.2.4 帮助模块……………………………………………………………..20
第4章 系统的界面与测试………………………………………….……………22
4.1 系统界面………………………………………………………………… 22
4.2 环境测试………………………………………………………………… 23
结束语………………………………………………………25
致谢…………………………………………………………25
参考文献……………………………………………………26
引言
§1.1课题背景
市场上的图像处理软件大都功能强大,需要好一阵子适应,普通的用户根本用不到那么多的功能。所以,可以开发一种简单小巧,可进行基本图像处理,主要针对数码照片进行处理及浏览的软件。
图像处理用到的算法多种多样,单是边缘检测包括梯度算子,方向算子,二阶算子。然后每种算子又可再细分,如梯度算子还包括Roberts, Sobel, Prewit三种。另外模糊,锐化等也都有相应的多种算法,这点在大型的图像处理软件中尤为多见。采用不同的算法对最终实现的效果有很大的影响,一般情况下,采用越是复杂的矩阵越是能达到理想的效果。可是矩阵的阶数越多越难实现,尤其还要变化成程序的格式,很容易出错。所以我打算主要从3阶的矩阵入手,研究一些简单易懂的算法。
在算法中,主要通过调整图像RGB之间的关系。或者是相邻点之间R或G或B的关系。由此就要了解三基色原理,还有在计算机中,0~255这个范围表示的颜色值。例如,当RGB都等于255的时候,颜色为黑色,都等于0的时候颜色为白色,由此也可以很方便的通过增减参数来调整图像的亮度,再根据三基色原理便可以通过单独增减R或G或B的值来调整图像的整体颜色,也可成为通道。
Delphi作为软件开发的一种工具,具有开发速度快,程序容易掌握,编译快,功能容易实现等特点。它所具有的强大控件组也是其他开发软件所没有的。它的强大功能,不但可以很容易地找到程序地出错点,还可以在短期内开发完成一个软件项目。它完成一个功能相对其他开发软件只需要少量的代码,且运行速度很快。除此之外,Delphi的界面还可以根据设计者的需要,通过编辑可以达到很漂亮的效果。
§1.2研究课题的任务、目的、意义
1.2.1课题的任务
实现图片的导入及保存;
实现图像的浏览:缩放与旋转;
实现图像亮度、对比度、饱和度等调节功能;
实现图像的滤镜效果;
1.2.2课题的目的
(1) 熟悉delphi软件开发平台,熟悉编程语言;
(2) 研究图像效果算法,将高等数学,线性代数等理论结合到编程实践中去,提高逻辑思维能力,和理论联系实际的实践能力;
(3) 真正系统地了解一个软件的整体开发过程;
1.2.3课题的意义
通过小型图像处理软件的编写,
首先,大大提高了编程水平以及逻辑思维能力;
其次,进一步熟悉了软件的制作流程及制作思路;
再次,进一步了解了相关图像处理软件的功能实现方法;
最后,为再次开发奠定了基础。
§1.3系统的主要功能与特色
1.3.1系统的主要功能
图像的打开及保存:支持jpg,bmp,ico,wmf,emf文件的导入及jpg,bmp,ico文件的保存。
图像编辑:图像的单步撤销和重做;整幅图的复制,剪切,粘贴,清除;
图像调整:位图变换(90度旋转,水平翻转,垂直翻转),取反色,取黑白两色,灰度图变换。可以用滑动工具条改变参数的有对比度,亮度,饱和度,RGB;
图像滤镜:曝光效果,浮雕效果。可以用滑动工具条改变参数的有锐化,模糊,添加杂色,喷溅效果,马赛克效果,霓虹效果;
在工具条一栏新增了放大缩小的效果:不会改变位图的实际大小,保存的时候以位图原先大小为准;
设置当前图像为壁纸:在鼠标右击图像显示的菜单中有该功能,可以设置图像为居中,平铺或者拉伸的效果。同时会保存名为WallPaperByDltjy的文件到该软件所存放的文件夹。
显示图片路径及实际宽和高:在软件最底端的工具栏会自动显示。
1.3.2系统的特色
采用Object Pascal面向对象语言,Delphi 7.0软件开发平台,并结合Billeniumeffect界面控件,具有运行速度快,操作简便容易上手,小巧精致,界面美观等特点。可以进行基本的图像处理,对不满意的数码照片进行颜色调节,或对比度调节等。
系统需求分析
§2.1本课题研究现状分析
随着计算机技术的日新月异,各种各样的图像处理软件也不断涌现于市场。比较知名的有adobe公司的photoshop,友立公司的我行我速,还有acdsee等等。其中最为畅销的当数功能强大的photoshop。该软件用到的图像处理算法被众多人所关注,并试图研究其研发思维和方法。于是接着出现了许许多多具有与其处理功能相类似的软件。现在的该类产品几乎都要满足普通用户的需求,界面要美观要整洁,功能还要易学易用。面对这么多形形色色的相关产品,想研发一个在市场上占有一席之地的实在很难。只能是从软件的小巧及实现基本的功能方面着手,先试着实现基本的一些处理效果。
§2.2要解决的技术难点及解决方法
图像的导入:导入图像的时候会出现闪烁的状况,这时候采用delphi的双缓冲功能来解决;要使得画布上的图像可以支持其他的效果编辑,必须将其先转换成位图bitmap,解决办法就是新建一个过程loadpicturefromfile,在该过程中,给出当导入的图片文件为某种类型的时候所对应的处理方案,例如bmp本来就是位图,那就可以直接导入,如果是jpg的就要建立一个Tjpgimage先导入该图像,然后对其进行像素化,转换为位图;
撤销及重做:本来想实现多步撤销及重复的功能,于是考虑到用双向链表,可是由于要考虑的问题太多了,当每执行一步新操作都要保存图像并且把图像地址保存到链表中,并记录其当前在链表中位置。执行撤销的时候又要调用链表中的指针及数据,结果就在链表中节点的新建和删除的时候出现了错误,由于时间不够,我对双向链表这方面筹集的资料还不够,所以只好暂时放弃多步撤销。现在采用的方法是通过再增加4个image,利用它们之间的位图数据调用来实现的,只能单步撤销及重做。
放大及缩小:刚开始的时候是通过改变位图的实际大小来实现缩放,后来发现这样不行,会丢失大量的图片数据,而且我设想的放大缩小应该是要保存的时候还保持和原先导入时一样的大小。上网筹集解决方案后终于得到解决办法:通过改变Timage的Stretch属性为真,AutoSize属性为假,然后在放大缩小的时候只要缩放它的宽和高的比例就可以了,这样又可以达到浏览的目的,又可以保证原图的实际大小不发生变化,更不会有图像数据丢失的问题。虽然编写出的程序没有多少行,可是方法却很关键。
附加的界面控件Billeniumeffect的使用:作为一个界面控件,它用它所有带bsskin前缀的控件代替了delphi中的可视控件,这样方便界面的编辑。可是,麻烦在于,该控件的用法并不是跟delphi原控件全都一样的,有的改变了属性,有的改变了用法。其中有用到的一个关键的控件就是scollbox滚动条,当图片大于画布最大尺寸的时候,就要用滚动条拖拉以显示其他未显示的尺寸。在delphi中只要直接拖用控件scollbox就可以解决问题。可是Billeniumeffect不同。后来借鉴了其他人做的关于Billeniumeffect控件使用的例子。原来不单要用到scollbox,而且还要拖用两个scollbar放在panel或groupbox上控制横向和竖向的拖动。
效果调整中的参数设置:每个算法都有其不同的参数设置问题,利用矩阵算法的尤其不好解决参数的调节问题。解决方法:多了解几种算法,采用容易调节参数及实现效果比较完美的算法。
效果的多样性研究问题:看到很多其他软件实现的效果,很漂亮,可是从效果猜想它的算法实在很难。解决方法:多参考图形学,图像处理算法等相关书籍,在编写程序的时候可以试着改变某算法的矩阵各个位置的值,或改变等式中的某个参数,也可以自己增加一个变量用以实现不同的效果。
§2.3系统设计的主要内容、目标
§2.3.1 系统设计的主要内容
实现图片的读取和保存;
实现图片的基本处理功能:如亮度、对比度、RGB等;
实现图片的浏览功能:缩放、旋转;
实现多样化的滤镜;
实现基本的撤销重做以及图像的复制,粘贴等;
§2.3.2 系统设计的目标
不出现异常警告,尽量减少bug;
界面整洁美观;
软件小巧,不占用太多内存;
运行速度快;
效果算法实用,耐用;
达到普通用户处理数码相片的需求。
§2.4系统开发的环境和工具
操作系统:Microsoft Windows 2000 Professional
编程语言:Object Pascal面向对象语言
开发工具:
●程序编写和界面设计: Delphi 7.0软件开发平台,结合Billeniumeffect界面控件。
●其他:
帮助文件及开始动画制作:flash动画软件flashMX 2004。
软件图标制作:矢量图形工具 Adobe Illustrator CS。
第三章 系统详细设计与主要算法
§3.1系统的体系结构和功能设计
体系结构简介(具体展开描述在3.2):
※photo是调用所有窗体的单元,并且记录每个form窗体与其对应的unit单元名称;
※主窗体程序模块:负责主窗体form1的程序调用,存放了整个系统中主要的程序,以及对其他各个单元的调用程序。要打开form2和form3两个窗体需要先调用该模块的程序;
※效果参数程序模块:负责form2的程序调用,主要存放可通过Ttrackbar滑动工具条实现效果参数调节的程序代码;
※图像处理模块:存放几乎所有的图像算法程序,专门提供给其它单元随时调用;
※帮助模块负责form3窗体,显示帮助信息。
§3.2系统各个模块的设计思路及实现方法
3.2.1 主窗体程序模块
◆打开图片(用到的过程和函数):
procedure OpenPicture;用于打开文件的时候把非bmp的图片像素化为位图导入到image1的画布上。
function LoadPictureFromFile(const FileName: string): TBitmap;
用于像素化非位图图像的函数,在过程openpicture中被调用。
procedure SetPictureMiddle;用于图片打开成功后可以在画布上居中显示。
流程图如下:
◆保存图片及另存图片
(1)保存图片 (2)另存图片
◆图像撤销及重做
建立一个过程procedure undouse;用于在每次执行新操作的时候都把当前图像保存到image2~image5中去,并调整image2~image5的图像。
调整如下(将前者的bitmap位图,assign分配给后者):
image1->image4,image1->image2,image5->image3,image5->image4,image1->image5.
然后在每个新操作执行完的时候都要执行一次这个过程,以保证及时能更新要撤销的图像。
撤销
继续调整image2~image5的关系:
image1->image4,image3->image1,image1->image5.
重做
调整image2->image1
◆图像的复制、粘贴、剪切、清除
剪切:先将当前位图复制,然后将其每点转换为白色。再将剪切的图像信息转jpg保存,方便粘贴的时候调用。
◆位图变换:90度旋转,图像垂直翻转,水平翻转。
90度旋转:调用过程procedure Rotatepicture(Bitmap: TBitmap);该过程主要以创建内存流和创建指针,并将其进行指针转移,数据转移后,逐列逐点存入数组中来实现图像的90度翻转。
垂直翻转:通过scanline扫描,建立两个Tbitmap进行对称列之间的字节交换,从而完成垂直翻转。
水平翻转:原理和垂直翻转一样,不过它是通过对称行之间的字节交换来实现的。
◆图像的反色、两色及灰度处理
反色:通过scanline扫描,对位图的每个点进行逻辑非操作。
两色:先把像素点上的三个字节乘以分别乘以一个小数(它们分别是0.3,0.59,0.11,是根据YUV颜色空间,Y分量的物理含义就是亮度,它包含了灰度图的所有信息,只求Y的值就可以得到灰度图,Y=0.3*R+0.59*G+0.11*B),然后处理得到改点在0~255之间的一个值。分析该值,如果大于128就将它的值改变为255(黑色),如果小于128就改为0(白色)。
灰度:对图像每个点的RGB取平均值,并将平均值赋予取值点。
◆图像的缩放
通过设置image1的属性image1.AutoSize:=false;image1.Stretch:=true;然后就可以通过同时调整image1的宽、高来实现图像的缩放。
◆界面切换
在form窗体中拖放多个TbsStoredSkin控件,分别载入指定目录下编辑好的界面文件skin.ini,然后改变bsSkinData1中的storeskin属性,使其指向特定的TbsStoredSkin,即可完成切换。
3.2.2 图像处理程序模块
全部靠效果参数程序模块和主窗体程序模块的调用实现效果。
◆图像的对比度、饱和度、亮度、RGB调节
对比度:为了达到理想的效果同时用了两个方法,一个方法用于控制变量值为正的时候(提高对比度),另一个方法控制变量值为负的时候(降低对比度)。
方法一:分别分析每个点的RGB值,大于128的就加上变量,小于的就减去变量(此时变量为正)。
方法二:变量的绝对值越大,图像就越接近RGB皆为127的灰色。如:针对某点的R值,取r=(R-127)*(变量 /255),然后再把r+R赋值给R,那么变量取值-255的时候,R=127。G和B也和R的原理一样。
饱和度:如图,amount为变量,用于进度条调节。I=255循环结束。
亮度:每点的RGB值都分别加上同一个变量。
RGB调节:如调节R,把R值加上当前指定的变量(滑动条的值)。G
和B的方法同R。
◆滤镜:曝光和浮雕(没有做滑动条调节变量的功能)
曝光:扫描图像,当一个点的R值小于128的时候,就对其取非。G和
B也同R一样方法。
浮雕:分为浮雕和雕刻,扫描的时候分别扫描两行或两列,扫描后取相
邻点的R差值,差值=R[i]-R[i+1],然后再进行赋值,R=差值+128。G和B同R一样方法。最后,再对RGB取平均值(R+G+B)/3,将该平均值赋给RGB,这样浮雕就不会有一些杂色。
浮雕和雕刻的区别:差值的等式不一样,雕刻的差值=R[i+1]-R[i]。
◆滤镜:锐化、模糊、杂色、喷溅、马赛克、霓虹
锐化:
模糊:如图3-10,图中每个圈内数字为3的是当前的点,这个图上的其
它点都和当前点在同一扫描行上,2为3的相邻点,1为2的另一个相邻点。
如:针对当前点的R值
R[I]=(3*R[I]+2*R[I-1]+2*R[I+1]+1*R[I-2]+1*R[I+2])/9,这就是当前点的未来取值与其相邻点和当前点之间的关系。R[I]等式注解:R[I]表示当前点,对应图中的3,R[I-1]和R[I+1]分别对应图中的2,R[I-2]和R[I+2]分别对应图中的1。
杂色: 设定一个随机数,随机数范围由变量(滑动条的值)决定,把每
个点的RGB值都分别加上该随机数。
喷溅:针对每个像素点取随机数运算(当前点坐标(i,j)
然后在位图范围内,把新取的坐标点(x,y)的像素信息赋给原点(i,j)。
马赛克:从图像的第一个点开始扫描,把它的字节赋给后面一定范围内的所有点。该范围可以通过变量设定,使用多个repeat……until语句,分别对行上的点进行赋值,直到达到变量范围的时候停止循环,继续范围外的下一个点。
霓虹:利用边缘检测算法,采用prewitte边缘算子
根据上面的矩阵再求当前像素点处理后的三个字节值,分别为:
max(r,R),max(g,G),max(b,B)
3.2.3 效果参数程序模块
该模块主要调用图像处理模块的图像处理过程,并安排每次打开form2窗体的时候要显示的处理效果。凡是有用到滑动条trackbar调整变量值的效果都要经过该模块调用图像处理模块的过程来实现。
例如:运行程序.exe,点击调节-对比度调节,这时候跳出一个窗体,该窗体就是源文件中的form2窗体,这时拉动该窗体上的滑动条,程序就会调用图像处理模块中的过程procedure ContrastChange(SrcBmp:Tbitmap;Amount:integer);对当前的Tbitmap进行效果处理,滑动条的value值就是Amount变量的值。点击窗体上的确定按钮,就会把当前滑动条的值赋给Amount,然后对主窗体上的图像进行效果处理。
另外,考虑到如果原图太大的话在form2窗体中利用滑动条看预览效果的时候会出现反应速度慢,占用内存太大的问题,所以又引入一个过程procedure TForm2.LoadImage(InputBmp:Tbitmap);用来在创建一个新图像,该图像高、宽的比例和原图一样,但是大小限制在一个固定的范围内。
3.2.4 帮助模块
关于:控制窗体form3,显示制作者信息。
帮助:调用外部文件,显示帮助信息。
由于不善于编写chm格式的帮助文件,所以这里采用的是flash的帮助文件。
优点:可以只有设计界面,还可以实现动画的互动效果。
要在delphi中显示flash文件,首先,必须确定电脑上安装有flash插件,然后,在delphi的Component菜单项选Import ActiveX Control选项,接下来在Import ActiveX Control项就会有Shockwave Flash (版本号)这项出现,选中它再按Install按钮安装。这时,查看ActiveX一栏下,可以看到新安装的控件shockwaveflash,拖放该控件到窗体上,可以通过改变其movie属性,改变访问电脑上flash文件的路径。
把flash上的按钮和delphi的事件联系起来:
先在flash所在的窗体的Tshockwaveflash控件设置下列event事件:
procedure TForm4.ShockwaveFlash1FSCommand(ASender: TObject; const command,args: WideString);
begin
if command='quit' then
begin
form4.Close;
end;
end;
然后设置flash源文件里所需的按钮的fscommand命令:点击该按钮,在动作里写上以下代码
on(press,release) //鼠标事件
{
fscommand(“quit”);
}
这样,在delphi的可运行文件上运行swf文件的时候,只要点击flash上的带有fscommand指令的按钮,就可以根据该指令指向的命令,对delphi的可运行文件作出反应。
根据这个原理也可以利用flash制作delphi编译程序的界面。
第四章 系统的界面与测试
§4.1系统界面
拖动滑动条的同时,右边的图像会跟着对应的滚动条参数变化。左边的为原图,方便对照用的。(需要用到滑动条的其他效果还有:亮度、饱和度、RGB调节、锐化、模糊、杂色、喷溅、马赛克、霓虹)
§4.2环境测试
测试计算机配置:x86 Family 6 Model 83
AT/AT COMPATIBLE
195,056 KB RAM
测试系统: Microsoft Windows 2000
5.00.2195
Service Pack 4
观察windows任务管理器:
在运行photo.exe之前cpu使用7%,刚打开文件的瞬间,cpu使用50%,然后有迅速降到7%,继续观察其它数据,当前没有操作的时候该程序的cpu使用为0,内存使用为7,856 K。
打开89.2 K的一张jpg图片,内存使用增加到11,084 K。再对其进行图像处理,除了滤镜喷溅执行的时候对cpu的要求比较大外,其他效果都只有少量的cpu使用率。喷溅的程序虽然不多,但是程序的语句循环中再加循环,调用次数比较多,所以,若是比较大的图像进行该效果处理的时候,要等一段时间才可以处理完。
系统兼容方面,在windowsXP系统上也测试通过。
结束语
经过几个月的资料积累和编程实践,终于完成了这个图像处理软件。通过这次锻炼,对delphi软件开发平台更加熟悉了,同时也对制作一个软件有了更新的认识,扩展了思维空间。
这个软件已经可以进行基本的图像处理,可以浏览并且编辑单张的图片。不过不足的是,由于技术上的欠缺,没有制作选定范围的工具,所以图像编辑一栏的复制粘贴都只能针对整幅图像。另外模糊、锐化、还有饱和度调整的效果都不够符合预期的要求,喷溅效果执行时又占用太多cpu,需要将来解决技术难点后重新改善算法。可能还有一些细节的地方做的不够,为了自己的心血没有白流,所以即使毕业设计结束了,以后编程中也会继续补充它们,继续完善这个系统。
致谢
本课题是在老师的细心指导和同学们的热心帮助下完成的。感谢导师为我们提供资料和意见,并经常抽空给我们讲解开发要求及思路,讲解我们在开发过程中遇到的难题,还帮我们制定计划,分配任务。感谢其他同学能在我随时需要帮助的时候尽自己所能帮我解决问题。
参考文献
[1]王汝传 《计算机图形学》 人民邮电出版社
[2]刘榴娣 刘明奇 党长民 《实用数字图像处理》 北京理工大学出版
[3]丁兆海 《Delphi基础教程》 电子工业出版社
[4]王小华 《Delphi 5程序设计与控件参考》 电子工业出版社
[5]赵子江 《多媒体技术基础》 机械工业出版社
[6]段来盛 郑城荣 曹恒 《Delphi实战演练》 人民邮政出版社
[7]高永来 《photoshop经典滤镜》 机械工业出版社
[8]张亚飞 《精通Flash MX结构化设计和开发》 科学出版社
[9]刘海涛 《Delphi程序设计基础》 清华大学出版社 2007年5月
[10]东方人华 吕伟臣 《Delphi8入门与提高》 清华大学出版社 2005年8月
[11]刘骏 《Delphi数字图像处理及高级应用》 科学出版社 2004年9月
【图像效果算法设计(一)】相关文章:
图像拼接算法及实现03-03
红外图像增强算法研究03-07
图像处理中的模糊算法及实现03-13
基于阶梯细化的图像放大算法03-07
超声医学图像滤波算法探究03-13
基于ICA的鲁棒图像水印算法11-22
探讨BP神经网络的图像Hash算法03-03