当前位置:文档之家› 基于Java的图像过滤技术

基于Java的图像过滤技术

203

 科技创新导报 Science and Technology Innovation Herald学 术 论 坛

2008 NO.14

Science and Technology Innovation Herald科技创新导报

对于从事计算机工作的人来说,图像过滤(Image Filtration)的概念并不陌生,Photoshop中为我们提供了很多图像过滤工具。在软件设计的过程中,充分利用这些工具来产生多种多样的图片特效往往会使我们的程序变得实用而具有吸引力。例如,当我们在图片上移动鼠标时,可以使鼠标指向点周围的图片区域产生亮度渐变的效果。图像过滤的原理并不复杂:利用特定的算法对源图像中的每个像素(Pixel)的颜色值(通常为ARGB值)进行处理,得到目标图像。

Java从JDK 1.2 开始引入了Java2D,自此,图像处理作为Java中一个相对独立的模块开始发展起来。Java 2D 同 Java 高级图像 API(Java Advanced Imaging API (JAI))协作,支持用大量图形格式处理复杂的图像。同时,Java开源项目Batik SVG 也为Java图像处理技术增添了不少活力。这些技术的快速发展正在逐步提高Java在图像处理领域的地位。Java中的图像处理类包含在java.awt.image等包中,各种处理操作基于java.awt.image.Buffered Image类和java.awt.image.Buffered ImageOp接口展开。其中,Buff-ered Image类定义了可访问图像的数据缓冲区,而BufferedImageOp接口提供了对图像执行基本操作的抽象方法,它以一个BufferedImage实例为源图像,并将经过处理的目标图像存储到另一个BufferedImage实例中。Buff-ered ImageOp的实现类Affine Transform-Op,ColorConvertOp,ConvolveOp,LookupOp,RescaleOp提供了对图像进行仿射转换、颜色转换、卷积转换等操作的具体实现方法。

J2SDK1.6为我们实现了为数不多的图像过滤器(类),但我们可以根据需要,利用上述内置类来定义自己的过滤器,如锐化过滤器、模糊过滤器等。除了J2SDK的标准API外,一些开源组织也提供了Java图像操作API,如org.jdesktop.swingx.image包提供了几种典型的图像过滤器http://jsourcery.com/api/java.net/swingx/09-02-2007/index.html,扩展了J2SDK的标准API,为

Java图像过滤操作提供了更多的便捷。

下图展示了一幅图像经过高斯模糊过滤器(GaussianBlurFilter)处理前后的显示效果。

Java图像过滤基本思路

我们用Java实现图像过滤操作的一般流程如下:

(1)创建一个图像过滤器实例Instance

Filter。

(2)将图像数据载入BufferedImage缓存中。

(3)调用InstanceFilter.filter(BufferedImage,BufferedImage)来过滤图像。

(4)将经过过滤的BufferedImage输出到屏幕或文件。

利用上述思路,我们便可利用已有的API来实现自己的图像过滤技术。下面我们实现一个过滤器LightFilter来模拟光照效果。

AbstractFilter类介绍

org.jdesktop.swingx.image.AbstractFilter类是一个图像过滤的抽象类,它实现了BufferedImageOp接口中除filter () 外的所有方法(限于篇幅限制,完整代码请到http://jsourcery.com/api/java.net/

swingx/09-02-2007/index.html 下载),每个方法在J2SDK 6 API文档中有详细介绍。

值得我们注意的是:AbstractFilter中下面的两个方法的应用是有条件

前者返回与源图像相同大小的目标图像边界框,在没有对源图像进行缩放操作的情况下成立;后者返回与源图像中给定点位置相同的对应的目标点位置,在没有对源图像像素进行几何变换的情况下成立。如非以上两种情况,需要对方法进行重写(override)。

实现自己的过滤器

我们要实现的过滤器LightFilter继承了AbstractFilter

并实现了抽象方法filter(BufferedImage src, BufferedImage dest)。

在SpotlightFilter类中我们定义了三个全局变量

分别代表光照强度(power)和光照的焦点(focusX, focusY),在构造函数中对他们进行初始化。

filter()方法是该类的核心。在方法中首先检查目标图像BufferedImage dest 是否为null,如果为nu

ll,则创建一个具有指定

ColorModel 的 BufferedImage。

为防止在处理过程中出现异常导致原始数据损坏,我们不是直接对原始数据进行处理,而将原始图片数据读入一维整型数组,数

组长度为图片长宽之积

注: getPixels()及下文的setPixels()均为org.jdesktop.swingx.graphics.GraphicsUtilities类中的静态方法。

其中图片数据在数组中的存储方式如下:数组中的每个元素存储一个颜色值,从左到右依次为A、R、G、B值,每个值占据8位(0~

255),这种存储方式充分利用了数组的存储空间且使数据集中化,便于操作管理。

接下来,我们将对数组pixels进行迭代,计算图像上各点经过处理后的颜色值。

对图像的遍历采取从左到右,从上到下的顺序进行,计算图像上各点与光照焦点(即亮度最大点)的距离。

为了模拟亮度随距离衰减效果,我们构造以下公式来计算亮度衰减系数factor:factor满足以下条件:当distance为0时factor为1,表示不衰减;当distance为无穷大时factor趋于零,亮度也趋于零。对于同一点factor随光强power增大而增大,factor的值范围为0~1(为了减小计算量,上述数学公式及变量均为对光照的近似化处理,在实际应用中,我们可以使用相关的光学公式来修改)。

最后,我们根据factor

改变颜色值并返

回。

循环体至此结束。

其中方法colorChange(int[], double)定义如下:

我们首先通过位运算从存储像素的整数中解析出A、R、G、B的值,然后将RGB值分别乘以衰减系数factor,再将改变后的RGB值整合到整数中。

基于Java的图像过滤技术

赵保学

(西北工业大学 软件工程专业 中国西安 710065)

摘 要:Java语言拥有不断完善的类库以及强大的扩展性、可移植性等诸多特性,为设计人员提供了极大的方便。图像过滤技术是计算机图像处理中的一个重要方面,在很多领域有着广泛的应用。本文对Java 2D API 中的一些图像处理工具进行了介绍,并以光照过滤器LightFilter为例,介绍了用Java实现图像过滤技术的一般流程。

关键词:Java ImageFilter ARGB 图像过滤(器) 光照模拟 图像过滤器中图分类号:TP21/27文献标识码:A文章编号:1674-098X(2008)05(b)-0203-02

204

科技创新导报 Science and Technology Innovation Herald

2008 NO.14

Science and Technology Innovation Herald

学 术 论 坛

科技创新导报在filter()方法的最后,用过滤后的图像数

据传入目标图像BufferedImage中,并返回目标图像。

至此,我们基本完成了过滤器LightFilter的实现。在应用程序中我们通过控制power及(focusX, focusY)来实现不同的效果。下面

是一幅图像经过此过滤器(power = 4)过滤前后的效果。

当我们需要定义新的图像过滤器时,利用相应的算法,修改filter()方法即可。J2SDK关于图像过滤的工具还有很多,利用它们可以方便地进行各种图像过滤操作。另外,即将发布JDK7版本中提出了Fork/Join模式,它可以充分利用多核CPU资源来完成复杂的计算任务,提高了Java语言的运算速度。Java图像过滤技术配合Fork/Join模式必将得到更充分的发展。

参考文献

注:

1.请读者到http://jsourcery.com/api/java.net/swingx/09-02-2007/index.html 下载查看AbstractFilter类及GraphicsUtilities类的源代码。

2.在应用中为了减少数据转换运算量,获到更好的效果,请使用TYPE_INT_ARGB或TYPE_IN

T_

GB

类型的图像。

附:

LightFilter类的完整代码

燃气是城镇现代化不可缺少的能源,在促生产发展、方便人民生活、节约能源和减少环境污染等方面发挥了很好的作用,随着我国“西气东输”的实施,迎来了我国城镇燃气大发展,城镇燃气必将发挥出更大的作用。但城镇燃气偶尔发生燃气事故也呈现出上升趋势,保障城镇燃气工程安全已成为标准化工作的重点。

燃气用户数量多,分布面广,燃气设备安装和使用条件千差万别,用户缺乏使用燃气的基本知识,对用户的安全监管有一定难度。因此,我国城镇管道燃气发生事故主要是发生在燃气用户处,其次是发生在燃气管道。燃气用户的多发事故主要有两类:

(1)燃气热水器事故。产生事故主要因素是燃气热水器燃烧时所产生的一氧化碳烟气未能及时排至室外,恶化了燃气热水器工作条件,造成室内空气中一氧化碳含量急骤上升而导致人员中毒事故。针对这类事故,国家标准《城镇燃气设计规范》GB50028—93(以下简称为《燃规》)从燃气工程的建造技术方面进行了相应的规定,如:“燃气热水器应按装在通风良好的房间或过道内;居民住宅厨房装有直接排气式燃气热水器时应设排气扇”。但有的用户违规自行安装,将直接排气式燃气热水器安装在通风不良的小室或浴室里,破坏了燃气热水器的使用条件,导致了事故的发生。

当建筑物没有预留伸出屋顶的烟道时,自

然通风烟道式燃气热水器宜在室外或低层建筑

(1~3层建筑)室内安装,不宜在多层住宅楼室内

安装。多层住宅楼用户建议应选用强排式或平

衡式燃气热水器。目前,燃气热水器年久失修

也成为引发燃气安全事故的重要原因之一。燃

气热水器像其他产品一样,在使用过程中有一

个由新到旧,由性能好到逐步变坏的过程。按

标准的规定,人工煤气热水器使用寿命为6年,

天然气和液化石油气热水器使用寿命为8年,超过使用年限的热水器,即使在正常条件下使用,

烟气中一氧化碳含量也往往超过标准,带来事

故隐患。

(2)燃气灶具事故。产生的原因是由于灶具

阀门和灶具前阀门密封质量差、连接灶具的胶

管脱落或老化等致使燃气泄漏导致人员中毒(气

源为人工煤气时)、发生爆炸或造成火灾事故。在国家标准《城镇燃气设计规范》对此有具体

规定:“胶管与燃气管道、接头管、燃烧设备的

连接处应采用压紧螺帽(锁母)或管卡固定”。

在城市中,燃气管道遍布于全市,管道长度

少则有几百公里,多则有上万公里。城市人员

密集、交通频繁、地下设施多,一旦发生事故,

往往危害大,社会影响大。因此,加强燃气管道

的安全管理尤为重要。燃气管道安全的事故比

较突出的主要有:

(1)施工单位盲目挖掘,燃气管道屡遭破坏。例如天津市2004年上半年仅天然气高、中压管道因施工外力因素发生的事故就有23次,这还不包括低压管道因盲目施工挖掘而引发的事故。(2)管道燃气泄漏爆炸事故。例如:某市居民楼附近煤气支管三通接头被汽车压裂,煤气长时间泄漏,通过墙上孔洞进入楼房地下防潮层封闭空间中,形成煤气与空气的爆炸混合物,遇明火引起爆炸,导致死亡数人、建筑物受损。这是由于三通接头安装处埋深过浅,达不到《燃规》的规定,管道回填土质和密实度不符合

规范要求,居民小区支路车辆荷载过大等原因造成的。总结燃气管道燃气泄漏引发事故的经验表明,地下空洞构筑物如:地铁、防空洞、电缆沟、暖气沟、下水道、阀门井、地下调压站、房屋下面的地下封闭室间、地下室等,都是可能形成燃气和空气爆炸混合物的场所。因此,地下

煤气管道敷设时应按照国家标准《城镇气设计规范》规定的间距,避免靠近上述密闭空间,保障燃气管道的安全。各种燃气事故的发生,往往都和违反燃气有关的标准规范有关,为了保证燃气工程的安全,必须从燃气工程设计、施工、运行和维护管理等方面大力推行标准化的成果,认真贯彻执行燃气工程有关的标准和规范,只有这样才能保证工程质量,预防和减少各种事故的发生,达到保障国家和人民生命财产安全的目的。

燃气安全必须标准化

梁惠杰

(哈尔滨市产品质量监督检验所)

中图分类号:TS914

文献标识码:A

文章编号:1674-098X(2008)05(b)-0204-01

[1] Sun Microsystems, Inc . JavaTM

Platform Standard Edition 6 API规范[S] . California, U.S.A, 2007.

[2] Free Software Foundation, Inc . Java

Source Code & Javadocs[Z] . Boston,U.S.A, 2007.

相关主题
相关文档 最新文档