Java数字图像处理:编程技巧与应用实践.html.pdf
《Java数字图像处理:编程技巧与应用实践.html.pdf》由会员分享,可在线阅读,更多相关《Java数字图像处理:编程技巧与应用实践.html.pdf(173页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、前言 为什么要写这本书 我对图像处理的认识最初来自于读软件工程专业时做毕业设计论文的需要,毕业论文做完以后,我便把所有关于图像处理的知识扔到了一边。2011年的一天有位朋友问了我几个简单的图像处理方面的 问题,在解答问题的过程中我发现自己对图像处理的热情一直都在燃烧,从那一刻起我决定重新学习图像处理。这之后,我把以前买的几本图像处理的书都读了一遍,同时还坚持通过写博客来督促自己加 深理解,随着学习的不断深入,对图像处理的认知也在不断加深,我越来越渴望自己能实现那些书中提到的图像处理手段与方法,于是便开始不断尝试,在经过了各种“坑”与无助之后,我终于编程实现 了学习过的每一种图像处理方法。这个过
2、程十分痛苦,因为我深刻感受到了图像处理在理论与实践之间的细微差异,而这些细微差异往往会导致处理结果与理论预期相差很大。 可能提到图像处理,很多人马上就会想到相关书籍中各种复杂的数学公式与矩阵计算,然后就会说我数学不好学不了这个,早早地就把自己给否定了。那些数学公式的确让人望而生畏,但是只要仔细 探究一番,就会发现它在图像处理的应用上远远没有看上去那么复杂,甚至可以说十分简单,这是本人学习图像处理时得到的最大一个心得体会,正如一句俗语说的:“世上无难事,只怕有心人”。 正是因为自己在学习过程中经历了痛苦,所以我想写一本不一样的图像处理入门图书,内容不再是冰冷的数学公式与文字描述,而是基于理论的实
3、践步骤和细节详解,是一个个可以直接运行的代码实 现,书中没有大量的数学公式,有的只是数学知识的巧妙运用。我希望通过分享自己学习过程中的体会与编程实践经验,帮助更多人在学习图像处理的道路上少走弯路,早日进入图像处理的科学殿堂。 在国内,程序员写书早已经不是什么新鲜事物,但是我可以肯定地说,本书是国内第一本由奋斗在编码一线的码农写的图像处理入门图书。它不是当下流行的视觉图像处理库的应用介绍,而是图像处 理基础知识和理论的学习与实践,正如一句西方科技谚语所说的那样,“在理论上,理论与实践是一致的,在实践上,它们是不一致的”。当前关于图像处理的书大多数都是重理论而轻实践,但图像处理 在理论与实践编程之
4、间是存在轻微差异的,而这就成了很多初学者无法逾越的鸿沟。本书就是要拟合理论与实践之间的鸿沟,帮助读者架起从理论到实践的大桥。 作为工作超过十年的程序员写的第一本书,本书也是我个人职业生涯的一个新起点,它鞭策与勉励自己不断努力上进,除了对图像处理的兴趣外,这一年多写书的动力更多的是毅力与帮助后来者的初 衷。只要本书能为国内图像处理专业知识的普及与应用实践略尽绵薄之力,那辛苦也就值了。 读者对象 本书适合以下人群阅读: 从事图像处理的工作人员 学习图像处理的爱好者 希望提升自我的中高级程序员 计算机专业高年级本科生或研究生 开设图像处理相关课程的大专院校学生 从事Java应用的开发者 如何阅读本书
5、 本书分为两大部分,其中第一部为前三章,主要介绍Java Swing编程的基础知识。第二部分是本书的核心内容,系统全面地介绍图像处理的各种方法与常见应用场景编程实现。如果你已经对Java语言 和Java Swing有基本的认识,可以跳过前三章,直接从第4章开始阅读本书。同时本书注重实践,所以请务必阅读给出的源代码并运行它,这样才能更好地理解所讲的知识。 第一部分为基础篇,简单地介绍了Java Swing图形与图像编程基本API使用技巧,以及相关实践编程,帮助读者了解图像接口在Java语言中的基础知识,并熟悉像素的读写与操作。 第二部分为实践与应用编程,从最基础的像素操作开始,通过实践编程讲解图
6、像处理过程中各种基本像素运算、混合、图像插值、直方图获取与图像搜索、图像卷积、边缘提取、二值图像分析与特征 提取等知识,最后通过剖析一个流行的图像油画转换算法编程实践来结束本书。 附录为本书相关数学知识简单参考。其他参考资料索引可在我的Github上找到。 此外,本书的源文件可到上通过搜索本书下载,或者到github上下载。 勘误和支持 由于作者的水平有限,编写的时间也很仓促,书中难免会出现一些错误或不准确的地方,恳请读者批评指正。本书配套源代码已上传到github上,访问地址 为: 你有更多的宝贵意见,也欢迎发送邮件至我的邮箱bfnh1998,我很期待能够听到你们的真挚反馈。 致谢 首先要感
7、谢图像处理学科那些伟大的先行者,是他们创立了这个影响力巨大的学科。其次要感谢CSDN博客频道,在CSDN我结识了很多良师益友,他们直言不讳地指出了我博客文章中的很多不妥之处 与需要改进的地方,特别是Trent、jichen324、qiwenmingshiwo、FDHGVH2461、cr459464757、wust小吴、xiaowei_cqu,以及这个仓促写就的名单之外的更多朋友,感谢你们的宝贵建议。 感谢机械工业出版社华章公司的编辑杨绣国老师,你的一封电子约稿邮件促成了本书,也帮助我实现了写一本注重实践的图像处理入门图书的梦想;感谢你的耐心,在这一年多时间里你不厌其烦地回 答我在写作过程中一个
8、又一个问题;感谢你的魄力和远见,始终支持我的写作,你的鼓励和帮助引导我顺利完成全部书稿。 最后一定要感谢我的父母,感谢你们将我培养成人;感谢我的妻子在我写书的这一年多时间让我从家务中解脱,给我支持与鼓励。 谨以此书,献给我最亲爱的两个孩子,以及众多热爱图像处理的朋友们。 贾志刚 中国,苏州,2015年9月 第1章 Java Graphics及其API简介 在开始本书内容之前,笔者假设你已经有了面向对象语言编程的基本概念,了解Java语言的基本语法与特征,原因在于本书的所有源代码都是基于Java语言实现的,而且是基于Java开发环境运行与演 示所有图像处理算法的。本书第1章到第3章是为了帮助读者
9、了解与掌握Java图形与GUI编程的基本知识与概念而写的。本章主要介绍Java GUI编程中基本的图形知识,针对GUI编程,Java语言提供了两套 几乎并行的API,分别是Swing与AWT。早期的Java GUI编程中主要使用AWT的相关组件,但是AWT的功能并不是十分强大,而且严重依赖本地接口。于是在Java 1.3及后续版本中引入了Swing工具实现 GUI编程,Swing中的组件大多数都是基于纯Java语言实现的,而不是通过本地组件实现的,所以它们是轻量级的GUI组件,同时Swing对图形与图像的支持操作也有很大的提高与增强。如何区分AWT组件 与Swing组件?一个简单而且相当直观的
10、方法是看Class的名称,Swing的组件大多数带有大写的前缀字母J。 Graphics作为Java的图形引擎绘制接口,几何形状、文字、图像的绘制都必须通过它完成,此外,Graphics还支持绘制过程的控制,可以设置画笔颜色、纹理、颜色填充方法、合成与裁剪路径及各种 Stroke与Fill的属性等。用户程序通常都是通过Graphics来访问绘制引擎,从而实现各种图形与图像绘制的,因此可以说Graphics是Swing中最重要的接口对象。好吧,下面让我们一起揭开Graphics的神秘 面纱。 1.1 什么是Java图形设备Graphics 简单地说Graphics是Java图形绘制引擎的访问接口
11、,只有通过它才可以访问到Java GUI的图形绘制引擎,实现图形的绘制与绘制过程的控制。 1.2 Java 2D API 当Graphics向下转型为Grahpics2D时,Java 2D的图形绘制引擎得以访问,一个功能更加丰富的图形库呈现在读者眼前,它就是Java 2D API。如果你问笔者Java 2D与Swing有何关系,可以很认真地 说,二者毫无瓜葛,Java通过引入Swing、Java 2D与Java 3D,极大地丰富了Java的图形功能,使应用程序接口更加完善,为各种可能的图形开发提供了可靠保证与全面支持,从而也使得学习Java图形方 面的知识时不再那么无助了。下面来看一下Java
12、 2D对图形支持与改进都包括了哪些: 为显示设备与打印机提供统一的绘制引擎。 一个广泛的几何形状支持。 文档打印支持。 可控制的绘制质量。 增强的色彩支持。 文字、形状、图像绘制检测。 1.3 用Java Swing绘制自定义的JPanel Swing的JPanel组件是GUI编程中最重要的面板组件,可以通过重写JPanel中paint-Component方法实现对JPanel面板组件的背景颜色的调整或添加背景图片,进而实现自定义版本的面板(JPanel) 组件。只要完成如下几步就可以实现一个简单自定义JPanel面板的绘制。 1)实现对JPanel面板的继承,代码如下: public cla
13、ss CustomJPanel extends JPanel / 更多代码 2)完成对paintComponent(Graphics g)对象的重载,代码如下: Protected void paintComponent(Grahpics g) / 绘制代码 3)访问Graphics绘制引擎,设置画笔颜色并完成绘制,在Java 2D中paint支持三种不同的画笔颜色填充策略,它们分别是: 单一颜色填充,如Color.BLUE、Color.RED等。代码如下: / 单一颜色背景填充 g2.setPaint(Color.BLUE); 线性渐变颜色填充(GradientPaint),可以细分为水平与
14、竖直方向。代码如下: / 水平方向线性渐变颜色填充 Color sencondColor = new Color(99, 153, 255); GradientPaint hLinePaint = new GradientPaint(0, 0, Color.BLACK, this.getWidth(), 0,sencondColor); g2.setPaint(hLinePaint); / 竖直方向线性渐变颜色填充 Color controlColor = new Color(99, 153, 255); GradientPaint vLinePaint = new GradientPaint
15、(0, 0, Color.BLACK, 0, getHeight() ,controlColor); g2.setPaint(vLinePaint); 圆周径向渐变颜色填充(RadialGradientPaint),支持两种以上的颜色渐变。代码如下: / 圆周径向渐变颜色填充 float cx = this.getWidth() / 2; float cy = this.getHeight() / 2; float radius = Math.min(cx, cy); float fractions = new float0.1f, 0.5f, 1.0f; Color colors = new
16、 ColorColor.RED, Color.GREEN, Color.BLUE; / cx, cy表示圆周的中心点距离 / radius 表示半径长度, / fractions表示色彩渐变关键帧位置,每个值取值在01之间 / colors 表示颜色数组 RadialGradientPaint rgp = new RadialGradientPaint(cx, cy, radius, fractions, colors, CycleMethod.NO_CYCLE); g2.setPaint(rgp); 4)设置背景图片支持。很多时候我们希望JPanel背景是一张图片而不是颜色填充,此时只需要将
17、BufferedImage对象通过drawImage()方法放在paintComponent()中即可,唯一需要注意的地 方就是确保BufferedImage对象不为NULL。代码如下: / 图片作为背景填充 if(image != null) / 0,0表示图像起始位置,相对于坐标为左上角位置 g2.drawImage(image, 0, 0, getWidth(), getHeight(), null); 5)实现一个测试的main方法代码如下: public static void main(String args) JFrame ui = new JFrame(Custom JPane
18、l); ui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); ui.getContentPane().setLayout(new BorderLayout(); ui.getContentPane().add(new CustomJPanel(), BorderLayout.CENTER); ui.setPreferredSize(new Dimension(380, 380); ui.pack(); ui.setVisible(true); 读者可以下载相关文档查看完整的源代码,源代码是本书的一部分,请读者尽量运行源代码,这样可以更好地帮助读者
19、理解所学内容。 1.4 Swing Java 2D的其他高级特性介绍 1.Stroke接口 Stroke是Graphics2D的API接口,用来实现图形的描边修饰,在Java 2D中只有一个完成Stroke接口的类BasicStroke,如果有需要,可以自己完成Stroke接口,实现自定义的Stroke类。如何使用 Stroke的实现类?方法如下: 1)调用Graphics2D的setStroke()方法,传入一个实例化的Stroke对象。 2)调用draw()方法,传入要绘制的几何形状。 BasicStroke的对象构造函数代码如下: / 创建Stroke对象实例 float dash =
20、10.0f, 5.0f, 3.0f; Stroke dashed = new BasicStroke(2.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 10.0f, dash, 0.0f); 其中: 第一个参数2.0f表示Stroke的宽度。 第二个参数声明Stoke的结束方式,BasicStroke.CAP_BUTT表示如果不是闭合区域则不做任何修饰,直接结束绘制,BasicStroke.CAP_ROUND表示如果不是闭合则添加圆角帽线,然后结束。 第三个参数表示线的连接方式,此处为JOIN_MITER。 第四个参数指定Stoke线段的长
21、度,此处线段长度为10。 第五个参数声明点线模式,此处点线模式dash为不等长线段。 第六个参数声明位移,0.0表示位移间隔为零。 更详细的参数说明可以参考JDK的官方文档,下面的代码通过创建BasicStroke实例对象来绘制一个虚线矩形: / 创建Stroke对象实例 float dash = 10.0f, 5.0f, 3.0f; Stroke dashed = new BasicStroke(2.0f, BasicStroke.CAP_SQUARE, BasicStroke.JOIN_MITER, 10.0f, dash, 0.0f); / 设置Graphics2D的Stroke对象引用
22、 g2.setStroke(dashed); / 创建形状 Shape rect2D = new RoundRectangle2D.Double(50, 50, 300, 100, 10, 10); g2.draw(rect2D); 2.Texture Fill接口 Texture Fill即纹理填充,Graphics2D提供了setPaint()方法来设置纹理填充,通过fill()方法可实现对几何形状的填充。前面讲到的两种填充方式分别为颜色填充与渐变填充,这里将重点介绍纹理 填充的类TexturePaint创建与使用。 TexturePaint通过构造一个BufferedImage对象作为纹
23、理来填充几何形状,因为Buffered-Image对象数据将被拷贝到TexturePaint中,所以BufferedImage对象设置得比较小为好。实例化一个 TexturePaint对象的代码如下: Rectangle2D rect = new Rectangle2D.Double(10,10,200,200); TexturePaint tp = new TexturePaint(image, rect) 其中image表示一个BufferedImage实例,rect表示截取作为纹理的区域。 使用实例化的TexturePaint来完成对矩形区域填充的代码如下: / Texture Fill
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Java 数字图像 处理 编程 技巧 应用 实践 html
限制150内