
為什麼要寫這本書
我對圖像處理的認識最初來自于讀軟體工程專業時做畢業設計論文的需要,畢業論文做完以後,我便把所有關于圖像處理的知識扔到了一邊。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.1 graphics概述
1.1.2 graphics圖形裝置的擷取、使用和銷毀
1.1.3 java swing graphics2d的重要屬性
<a href="https://yq.aliyun.com/articles/108908/">1.2 java 2d api</a>
1.2.1 基本的java 2d圖形繪制
1.2.2 使用java 2d實作太極圖形繪制
<a href="https://yq.aliyun.com/articles/108916/">1.3 用java swing繪制自定義的jpanel</a>
<a href="https://yq.aliyun.com/articles/108930/">1.4 swing java 2d的其他進階特性介紹</a>
<a href="https://yq.aliyun.com/articles/108933/">1.5 小結</a>
[第2章 java bufferedimage對象及其支援的api操作
2.1.1 raster對象的作用與像素存儲
2.1.2 圖像類型與colormodel
2.1.3 bufferedimage對象的建立與儲存
2.1.4 一個完整的imagebuffered讀取例子
<a href="https://yq.aliyun.com/articles/108969/">2.2 java bufferedimageop api</a>
2.2.1 java bufferedimageop 接口介紹
2.2.2 bufferedimage對象像素的讀寫方法
2.2.3 常見問題舉例
<a href="https://yq.aliyun.com/articles/108977/">2.3 基于bufferedimageop的圖像濾鏡示範</a>
<a href="https://yq.aliyun.com/articles/108980/">2.4 小結</a>
[第3章基本swing ui元件與圖像顯示
<a href="https://yq.aliyun.com/articles/108992/">3.2 jframe元件與main ui實作</a>
<a href="https://yq.aliyun.com/articles/108995/">3.3 jfilechoose檔案選擇框的使用</a>
<a href="https://yq.aliyun.com/articles/108998/">3.4 基本jbutton事件響應</a>
<a href="https://yq.aliyun.com/articles/109004/">3.5 一個完整的swing ui demo</a>
<a href="https://yq.aliyun.com/articles/109010/">3.6 小結</a>
第4章圖像屬性
4.1 失去的時光與回憶—老照片特效
4.2 圖像屬性
4.3 圖像的亮度、對比度和飽和度
4.4 圖像飽和度調整
4.5 圖像亮度調整
4.6 圖像對比度調整
4.7 綜合應用—調整圖像亮度、對比度和飽和度
4.8 小結