用vb编写图像处理程序算法的实现


第 24卷第 9期     计算机应用与软件 Vol.24 No. 9 2007年 9月   Compu terApplications and Softw are Sep. 2007 收稿日期 :2006 - 04 -11。 李俊荣 ,讲师 , 主要从 事计算机教学 与软 件开发 。 用 VB编写图像处理程序算法的实现 李俊荣  王振明 (沧州职业技术学院  河北 沧州 061001) 摘 要  随着计算机和多媒体技术的发展, 图像处理算法在编程中的地位显得越来越重要, 本文主要讨论了利用 VB 提供的取色 和画点两个关键方法 , 实现图像处理的几类常见方法。 关键字  VB 图像处理 三元色 THE IMPLEMENTAT ION OF THE ALGORITHM OF IMAGE PROCESSING BASED ON VB Li Junrong W ang Zhenm ing (Cangzhou VocationalTechnology Institute, Cangzhou 061001, Hebei, China) Abstract  A long w ith the technical developm ent of the calcu lator and the m ultim ed ia, the picture processing calcu late w ay is weaving the position in the d istance to seem to be more and more important, this text m ainly discussed to m ake use of VB to provide of take color and painting to order two key functions, carry ou t a few fam iliarmethods of p ictu re processing. K eywords  VB P ictu re processing Tricolor 0 引  言 目前图像处理方面的软件很多, 但有时候在编程时需要 把图像处理的功能嵌入到程序中 , 这就需要编程人员自己编 写相关代码。 在 VB 的教学过程中, 也经常有学生问到“怎样 把图像转换为灰度图像” , “怎样改变图像的透明度 ”等问题。 多数情况下是因为学生在报刊上看到有关的文章中介绍到实 现以上功能的方法, 文章中介绍的方法一般是通过调用 AP l函 数或 VB 外部控件来实现的, 而这些 API函数或外部控件在我 们使用的 VB6. 0版本中一般都找不到, 不能按文章中介绍的方 法实现类似功能。 实际上使用 VB 的基本绘图方法(主要是 Point 取色方法和 Pset画点方法), 再结合恰当的算法即可实现这些功 能, 甚至编写出类似 PHOTOSHOP图像处理软件也是完全可以做 到的。 下面就把几类常见的处理图像方法介绍如下, 以起到抛砖 引玉的作用, 有兴趣的读者可以和本文作者共同探讨。 1 创建程序界面并设置相关属性 在窗体上放置两个图片框, 给图片框 1 设置 Picture属性, 该图片即为要处理的图片, 为了得到好的操作效果, 本程序把处 理后的目标图片写 (绘制 )到 P ictu re2 上, 放置 9 个命令按钮。 设置窗体和命令按钮的 Caption属性, 操作界面如图 1, 所有对 象的其它属性一律为缺省值。 图 1 操作界面 2 算法原理和实现方法 为了获得较快的运行速度, 在窗体装载时把窗体、 Picture1 和 Picture2的坐标度量单位改为实际像素(绘图模式 ScaleMode 属性值设置为 3)。 P rivate Sub Form_Load()   ScaleM ode =3   P icture1. ScaleM ode =3   P icture2. ScaleM ode =3 E nd Sub ′单击图片框 2清除上次写上的内容 P rivate Sub Picture2_C lick()   P icture2. C ls E nd Sub 对图像处理的方法虽然很多, 常见的可以分为下面几类 (1)图像的反转和 90度倍数的旋转 包括水平反转、垂直反转、顺时针旋转 90 度、逆时针旋转 90度和旋转 180度的处理。 算法原理是按行和列依次读取原图像各点的颜色, 变换位 置后用原色写回到相应的位置。 ① 单击按钮 1时实现图像左旋 90度代码如下 : P rivate Sub Comm and1_C lick() ′单击按钮 1时完成本操作   For i=0 To Picture1. ScaleW idth    For j=0 To Picture1. ScaleH eight     ′从左到右 、从上到下依次读取原图像各点的颜色变换位置后 ′写回到 Picture2   216       计算机应用与软件 2007年     P icture2. PSet( j, Picture1. Sca leW idth - i), Picture1. Point( i, j)    Nex t j   Next i End Sub ② 单击按钮 2 时实现图像右旋 90 度, 用下面代码替代 ① 中的循环体部分即可 。 Picture2. PSet(P icture1. ScaleH eight- j, i), P icture1. Point(i, j) ③ 单击按钮 3 时实现图像旋转 180度, 用下面代码替代① 中的循环体部分即可 。 Picture2. PSet(P icture1. ScaleW idth - i, P icture1. ScaleHeight-j), Picture1. Point( i, j) ④ 单击按钮 1时实现将图像水平反转代码如下: Private Sub Comm and6_C lick()    For i=0 To Picture1. Sca leW idth     For j=0 To Picture1. Sca leH eight     P icture2. PSet(Picture1. ScaleW idth - i, j), Picture1. Point( i, j)    Nex t j   Next i End Sub ⑤ 单击按钮 5时垂直反转图像, 用下面代码替代④中的循 环体部分即可 Picture2. PSet (i, Picture1. ScaleH eight- j), Picture1. Point(i, j) (2)图像的去色处理(将彩色图像转换为灰度图像) 依次读取图像上各点的颜色, 把每点的颜色值分解为三元 色后, 求其平均值, 再以平均值分别作为红、绿蓝三元色的值写 回去。 原代码如下: Private Sub Comm and6_C lick()   For i=0 To Picture1. ScaleW idth    For j=0 To Picture1. Sca leH eight     co l=Picture1. Point(i, j) ′获得某点的颜色值     r=colMod 256 ′提取红色值赋给变量 r     g =col\256M od 256 ′提取绿色值赋给变量 g     b=co l\256\256 ′提取蓝色值赋给变量 b     pj=( r+g+b) /3 ′求出红 、绿 、蓝三元色的平均值     Picture2. PSet(i, j), RGB(pj, pj, pj) ′用平均值做为三元色写回位置   Next j  Next i End Sub (3)图像的胶片效果处理 (即反色处理, 得到和原图像的 胶卷相同的效果) 依次求出各点的三元色值后, 分别用它们的最大值 255减 去原值, 然后作为三元色写回去。 原代码如下: Private Sub Comm and7_C lick()   For i=0 To Picture1. ScaleW idth    For j=0 To Picture1. Sca leH eight     co l=Picture1. Point(i, j)     r=colMod 256     g =col\256M od 256     b=co l\256\256    ′分别用三元的最大值 255减去三元色的原值写回     Picture2. PSet(i, j), RGB(255 - r, 255 - g, 255 - b)   Next j  Next i E nd Sub (4)图像的半透明处理 分别读取图像各点的颜色, 和与其对应的放置图像的背景 的颜色, 各自分解为三元色, 让图像的颜色乘以不透明度, 放置 图像的颜色乘以透明度(1-不透明度 ), 然后将它们的值相加后 写回去即可, 下面例子为对图像进行半透明处理的原代码。 原代码如上: P rivate Sub Comm and8_C lick()  For i=0 To Picture1. ScaleW idth   For j=0 To Picture1. ScaleH eight    ′获取原图像某点的颜色     col1 =P icture1. Point(i, j)     r1=col1M od 256     g1=col1\256Mod 256     b1 =col1\256\256    ′获取绘制图像处的底色     col2 =P icture2. Point(i, j)     r2=col2M od 256     g2=col2\256Mod 256     b2 =col2\256\256    ′取其平均值写回     r =(r1 +r2) /2     g=(g1 +g2) /2     b=(b1 +b2) /2    P icture2. PSet(i, j), RGB(r, g, b)   Next j  Next i E nd Sub (5)马赛克效果的实现 将图像加工成马赛克效果是一种较常见的图像处理技术, 要将一幅图像加工成马赛克效果需要依次读取图像上各点, 及 其该点周围的颜色 (范围大小以马赛克大小而定, 本文以边长 为 5个点的小方块为例), 将每点的色分解为三元色后求其平 均值, 然后把该色写回到这一小正方形区域即可。 原代码如下: P rivate Sub Comm and9_C lick()  For i=2 To Picture1. ScaleW idth-2 Step 5   For j=2 To Picture1. ScaleH eight-2 Step 5       r1=0:g1 =0:b1=0     For k =i - 2 To i+2        For l=j- 2 To j+2           col=Picture1. Point(k, l)           r1=r1 +colMod 256          g1=g1+col\256M od 256          b1 =b1+col\256\256        N ext 1     Next k            r=r1 /25           g =g1 /25           b =b1 /25     For k =i - 2 To i+2        For l=j- 2 To j+2         Picture2. PSet(k, l), RGB( r, g, b)        N ext 1     Next k   Next j   第 9期    李俊荣等 :用 VB编写图像处理程序算法的实现 217    Next i End Sub 3 结束语 本文介绍了用 VB 实现图像处理的几类常见方法, 由于篇 幅限制有些图像处理没有介绍到, 如:模糊、锐化、增减对比度、 变亮、变暗、增减饮和度等, 要实现对图像的这些处理, 只要明白 这些概念的含义, 用类似前面介绍的 “取色 -写点”的方法是完 全可以实现的。 只是处理速度明显的要比现有的图像处理软件 要慢。 参 考 文 献 [ 1] 刘焕军 , 王耀南. 用混合编程开发图像处理系统. 电脑开发与应用 , 2003, 16(12):17. [ 2] 孙其 民 , 吴 恩 华. 全 局 光 照 环 境 中 的 逆 向 绘 制. 软 件 学 报 , 14 (10):1796. (上接第 82页) ⑨ U ser:代表应用程序的用户。 通过它与门户网站的授 权 /认证系统交互。 3. 1. 2 视图 Flex能够为 Struts应用程序提供丰富的、可扩展的用户界 面。 Flex采用 Rem oteObject实现 Flex页面与 Java对象之间的 通信。 在本文框架中它反映为 Facade模式的应用, 即 F lexFa- cade对象。 3. 1. 3 控制器 将系统划分为若干个子系统有利于降低系统的复杂性。 其 设计目标是使子系统间的通信和相互依赖关系达到最小。 实现 途径之一是引入 Facade对象, 为子系统中较一般的设施提供单 一而简单的界面。 报表发布框架在 Flex和 Java部分之间引入 了 Facade设计模式, 设计了 FlexFacade对象。 FlexFacade对象 在报表发布框架中扮演了前端的 Flex用户界面和后端的 Java 程序, 包括对表现层的适配器等 Java对象和业务逻辑层本身的 EJB 方法调用, 以及它们之间通信的中间站。 尽管系统中所有从 Flex页面发出的 Java方法调用都会经 过 FlexFacade, 但对于 EJB 调用来说, 由于 EJB和 Flex的开发是 同步进行的, 所以如果直接调用 EJB 方法, 在框架开发初期是 无法进行调试的。 为了进一步分离两个层次的开发, 报表发布 框架中使用了 proxy。 每个 EJB都有一个对应的 proxy类, 用于 同表现层交互的接口, 在 proxy类中包含了与 E JB 相同的方法 (命名和参数类型)。 在框架开发初期, proxy中的方法调用将 会直接返回一些硬编码数据给 Flex页面以帮助用户界面的开 发能够顺利进行, 同时也不影响后台 EJB的开发;当 EJB开发 结束, 框架开发工作进入到集成阶段的时候 , p roxy中的方法调 用将会指向后台 EJB中对应的方法。 3. 2 业务逻辑层 本框 架 实现 了 AppServiceEJB, ReportServiceEJB 和 Tem- p lateServiceEJB, 分别负责处理框架中应用程序业务逻辑, 报表 生成业务逻辑和动态报表模板业务逻辑。 下面具体介绍: ① AppServiceEJB:负责框架对应用程序级别的操作。 它提 供了接口得到框架内集成的应用程序信息;负责获取某个应用 程序所包含的 ROX, 并提供了接口与企业门户网站的授权和认 证模块交互, 来实现应用程序在框架内部的安全保障。 ② ReportServiceEJB:负责框架向报表服务器作最终参数提 交, 生成报表的操作。 它只包含一个具体方法 generateReport (), 将用户基于某个 ROX 定义的参数以特定形式提交到报表 服务器并取得 RO I信息。 ③ Tem p lateServiceEJB:负责对 Tem plate相关对象的操作, 如各种参数的集合。 提供了保存、装载、删除等对动态报表模板 的操作, 将用户自定义的参数信息以集合的形式保存到数据 库中。 Report Center在报表发布框架下的业务逻辑层部分主要包 括框架的 EJB 部分, 以及处在表现层与业务逻辑层之间的 Flex- Facade和直接调用 EJB的各种 proxy对象。 3. 3 数据逻辑层 报表发布框架中数据库主要保存了用户自定义的动态报表 模板以及相关参数的信息。 所有应用的数据都可以在数据库中 共存而不需要另外创建新的数据库实例。 Report Center的动态 报表模板信息会直接保存到为报表发布框架创建的数据库表 中, 不需要多余的配置信息。 4 结  论 框架规定了应用的体系结构, 阐明了整个设计、协作构件之 间的依赖关系、责任分配和控制流程, 表现为一组抽象类以及其 实例之间协作的方法, 它为构件复用提供了上下文关系。 报表 发布框架采用了基于 MVC 模式的 Flex /Struts集成和 EJB实现 J2EE的三层架构体系, 运用了 Facade设计模式。 Report Center 是实际项目案例, 它验证了本文报表发布框架的可行性和优点。 例如, 系统性能得到很大改善, 某些典型的测试用例的响应时间 从 120秒降低为 20秒。 据统计, 通过应用本框架, 我们项目组 开发的报表发布平台整体效率提升 20%, 开发效率提升 40%。 表 1就复用种类(是否允许修改可复用构件)、复用层和软件开 发效率等方面对应用报表发布框架的系统前后进行比较。 表 1 采用报表发布框架前后比较分析表 复用种类 复用层 软件开发效率 传统 开 发模式 直接复用 / 修改复用 非正式的代码复用 成品复用 减少 开 发 时 间 带 来的效益一般 采用 报 表发 布 框架 直接复用 / 修改复用 黑盒式代码复用 设计复用 交互操作性高复用 领域分析复用 加速投产时间 降低成本 提高软件质量 鉴于以上分析比较, 我们认为本文提出的金融系统的报表 发布框架可使软件结构清晰, 缩短软件开发周期, 提高软件的可 维护性和复用率。 参 考 文 献 [ 1 ] C om ponents, Framew orks, Patterns, Johnson R E. ACM SIGSOFT Soft- w are E ngineering Notes, 1997, 22(3). [ 2 ] Expert one-on-one J2EE Design and Development Rod Johnson 2003. [ 3 ] http:/ /www. m arkm e. com /cc /archives /004521. cfm A closer look at the F lex Programm ing m odel 2004, 3. [ 4 ] Flex应用程序性能 :改善客户端应 用程序和 服务器性 能的技巧 与 技术 M acromedia, Inc. 2004, 5.
还剩2页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 10 金币 [ 分享pdf获得金币 ] 0 人已下载

下载pdf

pdf贡献者

cyx199227

贡献于2016-09-29

下载需要 10 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf