《Java数字图像处理:编程技巧与应用实践》——导读

简介:


screenshot

前 言

为什么要写这本书

我对图像处理的认识最初来自于读软件工程专业时做毕业设计论文的需要,毕业论文做完以后,我便把所有关于图像处理的知识扔到了一边。2011年的一天有位朋友问了我几个简单的图像处理方面的问题,在解答问题的过程中我发现自己对图像处理的热情一直都在燃烧,从那一刻起我决定重新学习图像处理。这之后,我把以前买的几本图像处理的书都读了一遍,同时还坚持通过写博客来督促自己加深理解,随着学习的不断深入,对图像处理的认知也在不断加深,我越来越渴望自己能实现那些书中提到的图像处理手段与方法,于是便开始不断尝试,在经过了各种“坑”与无助之后,我终于编程实现了学习过的每一种图像处理方法。这个过程十分痛苦,因为我深刻感受到了图像处理在理论与实践之间的细微差异,而这些细微差异往往会导致处理结果与理论预期相差很大。

可能提到图像处理,很多人马上就会想到相关书籍中各种复杂的数学公式与矩阵计算,然后就会说我数学不好学不了这个,早早地就把自己给否定了。那些数学公式的确让人望而生畏,但是只要仔细探究一番,就会发现它在图像处理的应用上远远没有看上去那么复杂,甚至可以说十分简单,这是本人学习图像处理时得到的最大一个心得体会,正如一句俗语说的:“世上无难事,只怕有心人”。

正是因为自己在学习过程中经历了痛苦,所以我想写一本不一样的图像处理入门图书,内容不再是冰冷的数学公式与文字描述,而是基于理论的实践步骤和细节详解,是一个个可以直接运行的代码实现,书中没有大量的数学公式,有的只是数学知识的巧妙运用。我希望通过分享自己学习过程中的体会与编程实践经验,帮助更多人在学习图像处理的道路上少走弯路,早日进入图像处理的科学殿堂。

在国内,程序员写书早已经不是什么新鲜事物,但是我可以肯定地说,本书是国内第一本由奋斗在编码一线的码农写的图像处理入门图书。它不是当下流行的视觉图像处理库的应用介绍,而是图像处理基础知识和理论的学习与实践,正如一句西方科技谚语所说的那样,“在理论上,理论与实践是一致的,在实践上,它们是不一致的”。当前关于图像处理的书大多数都是重理论而轻实践,但图像处理在理论与实践编程之间是存在轻微差异的,而这就成了很多初学者无法逾越的鸿沟。本书就是要拟合理论与实践之间的鸿沟,帮助读者架起从理论到实践的大桥。

作为工作超过十年的程序员写的第一本书,本书也是我个人职业生涯的一个新起点,它鞭策与勉励自己不断努力上进,除了对图像处理的兴趣外,这一年多写书的动力更多的是毅力与帮助后来者的初衷。只要本书能为国内图像处理专业知识的普及与应用实践略尽绵薄之力,那辛苦也就值了。

读者对象

本书适合以下人群阅读:

从事图像处理的工作人员

学习图像处理的爱好者

希望提升自我的中高级程序员

计算机专业高年级本科生或研究生

开设图像处理相关课程的大专院校学生

从事Java应用的开发者

如何阅读本书

本书分为两大部分,其中第一部为前三章,主要介绍Java Swing编程的基础知识。第二部分是本书的核心内容,系统全面地介绍图像处理的各种方法与常见应用场景编程实现。如果你已经对Java语言和Java Swing有基本的认识,可以跳过前三章,直接从第4章开始阅读本书。同时本书注重实践,所以请务必阅读给出的源代码并运行它,这样才能更好地理解所讲的知识。
第一部分为基础篇,简单地介绍了Java Swing图形与图像编程基本API使用技巧,以及相关实践编程,帮助读者了解图像接口在Java语言中的基础知识,并熟悉像素的读写与操作。

第二部分为实践与应用编程,从最基础的像素操作开始,通过实践编程讲解图像处理过程中各种基本像素运算、混合、图像插值、直方图获取与图像搜索、图像卷积、边缘提取、二值图像分析与特征提取等知识,最后通过剖析一个流行的图像油画转换算法编程实践来结束本书。
附录为本书相关数学知识简单参考。其他参考资料索引可在我的Github上找到。

致谢

首先要感谢图像处理学科那些伟大的先行者,是他们创立了这个影响力巨大的学科。其次要感谢CSDN博客频道,在CSDN我结识了很多良师益友,他们直言不讳地指出了我博客文章中的很多不妥之处与需要改进的地方,特别是Trent、jichen324、qiwenmingshiwo、FDHGVH2461、cr459464757、wust小吴、xiaowei_cqu,以及这个仓促写就的名单之外的更多朋友,感谢你们的宝贵建议。

感谢机械工业出版社华章公司的编辑杨绣国老师,你的一封电子约稿邮件促成了本书,也帮助我实现了写一本注重实践的图像处理入门图书的梦想;感谢你的耐心,在这一年多时间里你不厌其烦地回答我在写作过程中一个又一个问题;感谢你的魄力和远见,始终支持我的写作,你的鼓励和帮助引导我顺利完成全部书稿。

最后一定要感谢我的父母,感谢你们将我培养成人;感谢我的妻子在我写书的这一年多时间让我从家务中解脱,给我支持与鼓励。

谨以此书,献给我最亲爱的两个孩子,以及众多热爱图像处理的朋友们。

贾志刚

中国,苏州,2015年9月

目 录

[第1章 Java Graphics及其API简介
1.1 什么是Java图形设备Graphics](https://yq.aliyun.com/articles/108898/)
1.1.1 Graphics概述
1.1.2 Graphics图形设备的获取、使用和销毁
1.1.3 Java Swing Graphics2D的重要属性
1.2 Java 2D API
1.2.1 基本的Java 2D图形绘制
1.2.2 使用Java 2D实现太极图形绘制
1.3 用Java Swing绘制自定义的JPanel
1.4 Swing Java 2D的其他高级特性介绍
1.5 小结
[第2章 Java BufferedImage对象及其支持的API操作
2.1 BufferedImage对象的构成(https://yq.aliyun.com/articles/108957/)
2.1.1 Raster对象的作用与像素存储
2.1.2 图像类型与ColorModel
2.1.3 BufferedImage对象的创建与保存
2.1.4 一个完整的ImageBuffered读取例子
2.2 Java BufferedImageOp API
2.2.1 Java BufferedImageOp 接口介绍
2.2.2 BufferedImage对象像素的读写方法
2.2.3 常见问题举例
2.3 基于BufferedImageOp的图像滤镜演示
2.4 小结
[第3章基本Swing UI组件与图像显示
3.1 JPanel组件与BufferedImage对象的显示](https://yq.aliyun.com/articles/108988/)
3.2 JFrame组件与Main UI实现
3.3 JFileChoose文件选择框的使用
3.4 基本JButton事件响应
3.5 一个完整的Swing UI Demo
3.6 小结
第4章图像属性
4.1 失去的时光与回忆—老照片特效
4.2 图像属性
4.3 图像的亮度、对比度和饱和度
4.4 图像饱和度调整
4.5 图像亮度调整
4.6 图像对比度调整
4.7 综合应用—调整图像亮度、对比度和饱和度
4.8 小结

相关文章
|
2天前
|
Java 测试技术 程序员
💡Java 零基础 | 深入理解注释的重要性与应用
【10月更文挑战第10天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
9 5
|
4天前
|
安全 Java UED
Java中的多线程编程:从基础到实践
本文深入探讨了Java中的多线程编程,包括线程的创建、生命周期管理以及同步机制。通过实例展示了如何使用Thread类和Runnable接口来创建线程,讨论了线程安全问题及解决策略,如使用synchronized关键字和ReentrantLock类。文章还涵盖了线程间通信的方式,包括wait()、notify()和notifyAll()方法,以及如何避免死锁。此外,还介绍了高级并发工具如CountDownLatch和CyclicBarrier的使用方法。通过综合运用这些技术,可以有效提高多线程程序的性能和可靠性。
|
2天前
|
开发框架 Java 程序员
揭开Java反射的神秘面纱:从原理到实战应用!
本文介绍了Java反射的基本概念、原理及应用场景。反射允许程序在运行时动态获取类的信息并操作其属性和方法,广泛应用于开发框架、动态代理和自定义注解等领域。通过反射,可以实现更灵活的代码设计,但也需注意其性能开销。
10 1
|
3天前
|
Java 测试技术 程序员
💡 Java 零基础 | 探索 if 条件语句的应用与技巧
【10月更文挑战第9天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
8 2
|
3天前
|
缓存 Java UED
Java中的多线程编程:从基础到实践
【10月更文挑战第13天】 Java作为一门跨平台的编程语言,其强大的多线程能力一直是其核心优势之一。本文将从最基础的概念讲起,逐步深入探讨Java多线程的实现方式及其应用场景,通过实例讲解帮助读者更好地理解和应用这一技术。
19 3
|
7天前
|
移动开发 Java 大数据
深入探索Java语言的核心优势与现代应用实践
【10月更文挑战第10天】深入探索Java语言的核心优势与现代应用实践
16 4
|
9天前
|
并行计算 Java API
Java中的Lambda表达式及其应用
本文将深入探讨Java中的Lambda表达式,从基本概念到实际应用。我们将了解Lambda表达式的定义、优势和使用场景,并通过实例展示其在Java编程中的强大功能。无论是初学者还是经验丰富的开发者,都可以从中获得有价值的见解。
|
10天前
|
Java 编译器
Java“操作符 ... 不能应用于 x”解决
当Java编译器报错“操作符 ... 不能应用于 x”时,通常是因为你尝试对不支持该操作符的数据类型执行了操作。解决方法包括:确保数据类型兼容、使用正确的类型转换或选择合适的方法。检查代码中的变量类型和操作符使用是否正确。
|
9天前
|
安全 Java UED
Java中的异常处理:理解与实践
【10月更文挑战第8天】在Java的世界里,异常处理是维护代码健壮性的守护神。本文将带你深入探索Java的异常处理机制,从基础的try-catch语句到高级的自定义异常,再到最佳实践和性能考量,我们将一起学习如何优雅地处理程序中的错误和异常情况。准备好,让我们一起迎接挑战,确保你的Java代码既安全又高效!
|
9天前
|
运维 Java Maven
Dockerfile实践java项目
通过上述实践,我们可以看到,Dockerfile在Java项目中扮演着至关重要的角色,它不仅简化了部署流程,提高了环境一致性,还通过多阶段构建、环境变量配置、日志管理、健康检查等高级特性,进一步增强了应用的可维护性和可扩展性。掌握这些实践,将极大地提升开发和运维团队的工作效率。
14 1