數字圖像處理原理與實踐:基於Visual C++開發

《數字圖像處理原理與實踐:基於Visual C++開發》是2011年出版的圖書,作者是左飛、萬晉森、劉航。

宣傳語

《Visual C++數字圖像處理開發入門與編程實踐》原書最新升級版

步步為營 循序漸進 全新升級

深入與淺出並重,理論同實踐共舉

內 容 簡 介

本書全面系統地講述了在Visual C++環境下進行數字圖像處理編程的技術和方法。全書共分成14章,針對數字圖像處理領域中的核心話題,如色彩空間、圖像檔案格式、圖像的點運算、圖像的幾何變換、圖像的增強處理、邊緣檢測和輪廓跟蹤、圖像形態學、圖像分割、圖像加密等,進行了詳細的介紹。另外,針對Visual C++ 2005下的數字圖像處理開發,本書還對設備無關點陣圖、圖形設備接口、OpenCV及ImageMagick等在實際開發中常用的具體技術進行了講解,並輔以大量實例代碼,具有很強的參考價值。

本書兼有源於實踐、貼近套用、深入淺出、通俗易懂的優點,又緊跟時代脈搏,牢牢把握最新技術方向,從案例出發強調新環境下的新方法。本書內容實用、體例新穎,既可以作為希望進行數字圖像處理學習和研究的初學者的自學教材,也可作為大專院校計算機及相關專業師生或工程技術人員的參考書。

談治學——代序

自世界上第一台電子計算機問世以來,現代計算機科學已經走過了極為不平凡的六十餘年輝煌歷程。有時想想,自己不禁感嘆,相對於已經發展了幾十年甚至上百年的任意一門學科,我們的學習過程實在太短暫了。要充分理解一個領域,時間顯然是不夠的,更何況現在學科門類越分越細,學科交叉現象越來越多,因此我們往往要同時面對多個領域。如果你是一名研究生或者博士生,有時也許可能會感到自己已經對某個領域“觀其大略、略有小成”。其實自己是否真的已經達到這種狀態並不重要,因為幾年之後,當我們再回想起來,或許自然就會感到當時的稚氣而不失活潑的勁頭。如果現在,你的這種感覺愈發強烈,那么說明你在自己研究的這個方向上已經有了不小的長進。

有人說自己“學得越多就會感到懂得越少,知道得越多就會感到理解得越少”,其實說的就是自己在不停地進步。在現行學習的各種情境下,大家都變得匆忙起來,匆忙的人容易被欺騙,於是我們會聽信一些自己或別人有限理解下的狹隘看法,甚至我們會將這些看法作為一種基點,甚至會看成是一種準則。就像現在每天網路上都會有海量信息向我們湧來,儘管沒有人會對網上的言論負責,但我們確實很容易在不經意之間將瀏覽網頁時看到的一條難辨真偽的訊息迅速地、不假思索地照單全收、信以為真。於是現在漫天飛舞的那些關於某位明星突然病故的謠言才會如此神速地傳播開來。八卦謠言如此,學術研究更是如此。這其實也沒什麼,重要的是我們不能讓這種看法傷害到自己及自己努力的腳步。

大家都會寫論文、看論文。看論文講求看高質量的,這是當然。我們也無非是想在前人的基礎上做出一點點創新工作。前人的理論結果在這短暫的過程與浩瀚的領域下似乎只是偏離及錯誤的程度不同,因為論文是在搞研究,是一些還未出現的假想的規則,或是一些假想的解決方案。它們基於的都是另一些研究的成果,“踩在別人的肩膀上,肩膀在哪並不重要,是不是巨人的也不重要,只要以後有人踩踩自己的肩膀就行了”,在這種情況下對與錯、是與非、準確與偏離的界限也越來越朦朧。

有時會覺得別人的做法、方式、結果其實並不好。有時甚至會認為其實對與錯並不那么重要,它只是在很多條件、環境、約束下的一種看法。人們所做的事情—只是讓周圍最值得注意的一類人群儘可能滿意就已經很好了。現在的媒體、老師,甚至一些同學我覺得都已經具備了一種令人驚嘆而又平凡的能力,那就是“可以把白的說成黑的,緊接著在情況不對時,又可以再把黑的說成白的”這種能力。有人對肖氏反射弧提出質疑,發明人就會不惜觸犯法律的威嚴拿起鐵棒還對方以顏色。一方面是把白的說成了黑的,而另一方面大部分人選擇了默認,欣然接受了指鹿為馬的事實。而對於我們每個人,說到底最重要的還是要抓緊時間“多走一點路”,用不斷前進的腳步走出各種環境,使自己不用淪落到非得用“把白說成黑”這種三流手段去騙取點什麼的地步,更重要的是使別人在把白說成黑的時候,我們依然能夠保持一份清醒。

感慨了這么多,寫在我新書的最前面,真誠地希望本書的讀者能夠把如何治學這個問題想個清楚明白。若能如此,我想正在看本書的你定能在自己所從事的領域中有所收穫、有所成績。

前 言

大約兩年多前,我同萬晉森、劉航合作編寫了《Visual C++數字圖像處理開發入門與編程實踐》(電子工業出版社出版)一書。作為一本在Visual C++環境下講解數字圖像處理開發的方法與技術的書籍,該書贏得了頗佳的口碑。許多讀者紛紛來信,無論是對書品的褒獎,還是與我們探討技術問題,都令我們為之鼓舞。

有鑒於《Visual C++數字圖像處理開發入門與編程實踐》所取得的不錯成績,電子工業出版社的有關編輯建議我們緊跟時代步伐與技術發展趨勢,適時對原書進行修訂以期再版。經過一番思度與商討,我們決定結合第一版書的讀者反饋並聯繫技術發展的最新動向,以原書為基礎重新著書立說,於是便有了這本《數字圖像處理原理與實踐:基於Visual C++開發》。

脫胎於原書的改版本,一方面保持了前作通俗易懂、理論聯繫實際的風格,另一方面,我們也進行了大膽的調整,刪減了一些比較基礎性的導引篇幅和相對比較陳舊的內容,同時增補了一些更新穎的話題及更豐富的實例。

近年來,隨著研究的不斷深入,數字圖像處理套用也日益廣泛,這使得數字圖像處理的廣度和難度不斷加強,但同時對於初學者的學習帶來了相當的困難。觀察現有的眾多數字圖像處理書籍,大部分教材注重圖像處理理論的闡述,而在一定程度上忽略了這些理論的套用和實現。另外,對於一些實例教程,雖然重視了代碼的實現,卻在算法的描述和擴展上略有欠缺。這使得讀者很難通過一本書比較全面地了解和掌握數字圖像處理的基礎內容。

為此,儘可能通俗地為讀者描述圖像處理算法的原理和實現手段,並為讀者提供翔實可靠的實現代碼,確保每一個讀者都能理解和掌握,始終都是我們在創作過程中最大的考量。本書系統地介紹了套用Visual C++進行數字圖像處理編程的基本思路和方法,採用案例為主的敘述方式,將大量的技術理論融入具體的案例剖析中。涉及數字圖像處理領域中十餘個重要主題,提供了近百個具體算法的實現源碼,代碼總量有數萬行之多。

總的來說,本書依然本色地保持了前作中體現出來的幾個有別於其他同類書籍的優點。

首先,與集成開發環境深度結合。在深入剖析MFC機制的同時將豐富的圖像處理與編程實現融為一體。

其次,敘述過程中始終不脫離實踐這個主題,每章都設定相應的實例帶動讀者進行學習。穿插於書中的實例為本書的一大特色。這些實例大都為時下流行的圖像處理軟體的某個具體模組或部分的實現,實例原型十分常見。這些巧妙新穎的實例將使枯燥乏味的理論變得妙趣橫生。全書實例都在Visual Studio 2005下調試通過,讀者可以在隨書光碟中獲得有關源碼。

最後,筆者自主編寫了一個擴展性良好的數字圖像處理算法試驗平台Magic House。Magic House不僅完整實現了一款普通數字圖像處理軟體應具備的基本功能,而且它框架清晰、容易理解,非常適合讀者學習。我們也看到,前作出版後其他作者跟風出版的一些數字圖像處理作品中有嚴重抄襲和剽竊Magic House的現象發生,但作為Magic House的原創者,沒有哪本書能夠比我們更透徹地向讀者介紹這個軟體的架構與實現。

除了傳承前作的優點之外,本版又有哪些變化呢?

首先,本版增加了對部分複雜算法的更為細緻的講解與描述,同時也豐富了前作的實例代碼資源。

其次,本書增加了一些包括圖像加密(特別是圖像的混沌加密)等在內的前沿話題,為有志在此發展的讀者提供了獨一無二的資源。

最後,除了前作中介紹到的DIB、GDI+和OpenCV,本版中還增加了對ImageMagick的介紹。作為近年來發展和流行起來的數字圖像處理庫,ImageMagick已經受到廣大開發者的青睞,但目前國內尚無對它的相關資料出版,這也是本版中的一個亮點。

我們都知道,數字圖像處理是一門飛速發展的技術。國內大部分數字圖像處理教材都長期不更新,而且同類書籍千篇一律,很多讀者迫於無奈,只能在許許多多陳舊不堪的內容上翻來覆去。因此,我們也希望能夠為這個領域的後來者拋磚引玉,為同類書籍注入一絲清新的空氣。

本書前一版本承蒙多位專家指導與幫助,其中西北工業大學計算機學院博士生導師王慶教授審閱了本書前版並提出了寶貴的意見和建議,西北工業大學計算機學院馮萍教授對本書前版的寫作給予了誠懇的支持,中國科學院高級工程師、技術作家白喬博士在我的創作過程中始終鼎力相助。這裡,再次向他們表示最誠摯的感謝。另外,我的兩位合作者—網易遊戲的萬晉森與騰訊科技的劉航—在技術方面一直都非常令我欽佩,他們在百忙之中與我一道編寫此書,令我深感振奮。正是由於有了他們的加盟,本書才得以付梓,也感謝他們為本書作付出的一切!最後,我也要感謝本書第一版的讀者朋友們,他們誠懇的意見與建議使得新版更加精進、更加完美,給予我們的鼓勵也一直驅使著我們前行。

由於時間倉促,紕漏和欠缺之處在所難免,言語之中有失偏頗之處,還望讀者不吝賜教和批評。

左 飛

2010年12月

於珠水之濱

目 錄

第1章 Visual C++與數字圖像處理

1.1 數字圖像處理概述

1.1.1 圖像與數字圖像

1.1.2 數字圖像處理研究的內容

1.1.3 數字圖像處理的套用

1.2 Visual C++概述

1.2.1 程式語言的奇蹟

1.2.2 Visual C++簡介

1.2.3 卓越的集成開發環境

1.3 在Visual C++中處理數字圖像

1.3.1 點陣圖和調色板

1.3.2 圖形設備接口

1.3.3 OpenCV

1.3.4 ImageMagick

1.4 本章實例:利用Visual C++實現畫圖程式

1.4.1 實例預覽

1.4.2 開始創建項目

1.4.3 完成實例編碼

第2章 色彩系統

2.1 學習圖像處理從認識色彩開始

2.1.1 什麼是顏色

2.1.2 顏色的屬性

2.1.3 光源能量分布圖

2.2 CIE色度圖

2.2.1 CIE色彩模型的建立

2.2.2 CIE色度圖的理解

2.2.3 CIE色度圖的後續發展

2.3 常用色彩空間

2.3.1 RGB顏色空間

2.3.2 CMY/CMYK顏色空間

2.3.3 HSV/HSB顏色空間

2.3.4 HSI/HSL顏色空間

2.3.5 Lab顏色空間

2.3.6 YUV/YCbCr顏色空間

2.4 色彩空間的轉換方法

2.4.1 RGB轉換到HSV的方法

2.4.2 RGB轉換到HSI的方法

2.4.3 RGB轉換到YUV的方法

2.4.4 RGB轉換到YCbCr的方法

2.5 本章實例:Photoshop色彩編輯器的實現

2.5.1 需要解決的若干問題

2.5.2 開始創建項目

2.5.3 完成實例編碼

第3章 圖像檔案的格式與編碼

3.1 圖像檔案概述

3.1.1 圖像檔案

3.1.2 圖像檔案的一般結構

3.1.3 圖像檔案的常用參數

3.2 BMP檔案格式

3.2.1 檔案結構

3.2.2 檔案頭和信息頭

3.2.3 主要參數

3.3 GIF檔案格式

3.3.1 GIF格式簡介

3.3.2 GIF檔案結構

3.3.3 GIF檔案塊的結構

3.4 PNG檔案格式

3.4.1 PNG格式簡介

3.4.2 PNG檔案結構

3.4.3 PNG中的關鍵數據塊

3.5 離散餘弦變換

3.5.1 基本概念及數學描述

3.5.2 離散餘弦變換的意義

3.5.3 離散餘弦變換的實現

3.6 圖像的壓縮編碼

3.6.1 霍夫曼(Huffman)編碼

3.6.2 LZW編碼

3.6.3 行程編碼

3.7 JPEG檔案及其解碼程式的實現

3.7.1 JPEG檔案概述

3.7.2 JPEG的編解碼原理

3.7.3 JPEG檔案的格式

3.7.4 JPEG解碼程式的實現

第4章 使用DIB處理數字圖像

4.1 設備相關點陣圖和設備無關點陣圖

4.1.1 設備相關點陣圖(DDB)

4.1.2 設備無關點陣圖(DIB)

4.2 CBitmap類

4.2.1 創建DDB

4.2.2 CBitmap中的成員函式

4.2.3 套用DDB顯示圖像

4.2.4 套用DDB顯示大圖像

4.3 進一步了解DIB

4.3.1 DIB的結構

4.3.2 DIB信息段

4.3.3 點陣圖數據

4.3.4 與DIB有關的函式

4.4 本章實例:DIB類的封裝

4.4.1 類的抽象與設計

4.4.2 編寫構造函式

4.4.3 DIB點陣圖的顯示

4.4.4 BMP檔案的存儲

第5章 使用GDI+處理數字圖像

5.1 GDI+簡介

5.1.1 GDI+概述

5.1.2 GDI+的結構

5.1.3 GDI+在Visual C++ 2005中的配置

5.2 GDI+基礎

5.2.1 Graphics類

5.2.2 GDI+的基本數據類型

5.2.3 GDI+中的顏色

5.3 GDI+處理圖像的基本方法

5.3.1 GDI+的圖像類

5.3.2 創建圖像對象

5.3.3 圖像的顯示和縮放

5.3.4 圖像的基本處理方法

5.4 圖像的剪裁

5.4.1 剪裁區域

5.4.2 GraphicsPath類

5.4.3 Region類

5.5 處理圖像的色彩

5.5.1 ColorMatrix結構體

5.5.2 改變圖像的透明度

5.5.3 將圖像轉換為灰度圖

5.5.4 改變圖像的亮度

5.5.5 改變圖像的對比度

5.6 本章實例:播放GIF動畫

5.6.1 播放原理分析

5.6.2 處理過程

5.6.3 具體實現

第6章 常見圖像顯示特效

6.1 顯示特效概述

6.1.1 顯示特效基礎

6.1.2 顯示特效過程

6.1.3 顯示特效類

6.2 掃描顯示特效

6.2.1 特效預覽

6.2.2 基本原理和實現方法

6.2.3 編程實現

6.3 移動顯示特效

6.3.1 特效預覽

6.3.2 基本原理和實現方法

6.3.3 編程實現

6.4 百葉窗顯示特效

6.4.1 特效預覽

6.4.2 基本原理和實現方法

6.4.3 編程實現

6.5 柵條顯示特效

6.5.1 特效預覽

6.5.2 基本原理和實現方法

6.5.3 編程實現

6.6 馬賽克顯示特效

6.6.1 特效預覽

6.6.2 基本原理和實現方法

6.6.3 編程實現

6.7 雨滴顯示特效

6.7.1 特效預覽

6.7.2 基本原理和實現方法

6.7.3 編程實現

6.8 本章實例:類似ACDSee的圖像瀏覽工具

6.8.1 實例預覽

6.8.2 概要設計

6.8.3 完成實例編碼

第7章 圖像的點運算

7.1 灰度直方圖

7.1.1 灰度直方圖

7.1.2 基本原理

7.1.3 編程實現

7.2 灰度線性變換

7.2.1 基本原理

7.2.2 編程實現

7.3 灰度非線性變換

7.3.1 灰度對數變換

7.3.2 灰度冪次變換

7.3.3 灰度指數變換

7.4 灰度閾值變換

7.4.1 基本原理

7.4.2 編程實現

7.5 灰度拉伸

7.5.1 基本原理

7.5.2 編程實現

7.6 灰度均衡

7.6.1 基本原理

7.6.2 編程實現

第8章 對圖像進行幾何變換

8.1 圖像幾何變換的基本理論

8.1.1 圖像幾何變換概述

8.1.2 圖像幾何變換的數學描述

8.2 圖像的平移變換

8.2.1 效果預覽

8.2.2 基本原理

8.2.3 編程實現

8.3 圖像的鏡像變換

8.3.1 效果預覽

8.3.2 基本原理

8.3.3 編程實現

8.4 圖像的轉置

8.4.1 效果預覽

8.4.2 基本原理

8.4.3 編程實現

8.5 圖像的縮放

8.5.1 效果預覽

8.5.2 基本原理

8.5.3 插值算法介紹

8.5.4 編程實現

8.6 圖像的旋轉

8.6.1 效果預覽

8.6.2 基本原理

8.6.3 編程實現

8.7 使用GDI+實現圖像的幾何變換

8.7.1 GDI+的變換操作

8.7.2 平移

8.7.3 縮放

8.7.4 旋轉

8.7.5 變換的組合

8.7.6 利用矩陣進行其他幾何變化

第9章 圖像的增強處理

9.1 圖像的簡單平滑

9.1.1 鄰域處理的基本概念

9.1.2 圖像的簡單平滑原理

9.1.3 圖像簡單平滑的算法實現

9.2 圖像的高斯平滑

9.2.1 平滑線性濾波器

9.2.2 高斯平滑的原理

9.2.3 高斯分布

9.2.4 高斯平滑的算法實現

9.3 圖像的中值濾波

9.3.1 統計排序濾波器

9.3.2 圖像中值濾波的原理

9.3.3 圖像中值濾波的算法實現

9.4 圖像的拉普拉斯銳化

9.4.1 圖像的銳化

9.4.2 拉普拉斯銳化的原理

9.4.3 拉普拉斯銳化的算法實現

9.5 Sobel邊緣細化

9.5.1 Sobel邊緣細化的原理

9.5.2 Sobel邊緣細化的編程實現

第10章 圖像的邊緣和輪廓

10.1 邊緣檢測

10.1.1 邊緣檢測的基本概念

10.1.2 常規邊緣檢測

10.1.3 帶方向的邊緣檢測

10.1.4 拉普拉斯運算元

10.2 Hough變換

10.2.1 平面坐標系的轉換

10.2.2 Hough變換的思想

10.2.3 直線的Hough變換

10.2.4 圓的Hough變換

10.2.5 彩色圖像的Hough變換

10.3 種子算法

10.3.1 算法介紹

10.3.2 編程實現

10.4 輪廓跟蹤

10.4.1 區域表示方法

10.4.2 計算區域的面積和周長

10.4.3 單區域跟蹤

10.4.4 多區域跟蹤

第11章 圖像的形態學處理

11.1 數學形態學

11.2 一些必要的概念和符號約定

11.3 圖像的腐蝕

11.3.1 腐蝕原理

11.3.2 編程實現

11.4 圖像的膨脹

11.4.1 膨脹原理

11.4.2 編程實現

11.5 腐蝕和膨脹的性質及套用

11.5.1 腐蝕和膨脹的代數性質

11.5.2 腐蝕和膨脹的套用

11.6 開運算和閉運算

11.6.1 開運算

11.6.2 閉運算

11.6.3 編程實現

11.6.4 開運算和閉運算的代數性質

11.7 圖像形態學的其他運算

11.7.1 擊中/不擊中運算

11.7.2 細化處理

11.8 基於形態學分水嶺的圖像分割

11.8.1 基本概念

11.8.2 分水嶺算法

11.8.3 編程實現分水嶺分割

第12章 數字圖像的加密與隱藏

12.1 混沌理論概述

12.1.1 混沌理論的發展

12.1.2 混沌的基本概念

12.1.3 混沌的度量與判定

12.2 幾種典型的混沌系統舉例

12.2.1 Logistic映射

12.2.2 Henon映射

12.2.3 Chebychev映射

12.3 數字圖像的混沌加密簡介

12.3.1 密碼學與混沌密碼學

12.3.2 圖像混沌加密算法的分類

12.4 基於置亂的圖像加密技術

12.4.1 數字圖像與排列變換

12.4.2 利用Hilbert曲線置亂圖像

12.4.3 利用Arnold變換置亂圖像

12.4.4 數字圖像置亂算法的評價

12.5 混沌在圖像加密中的套用

12.5.1 以排序法為基礎的混沌置亂

12.5.2 基於起始地址法的混沌置亂

12.5.3 基於灰度值變換的混沌加密

12.5.4 對圖像進行混沌加密的評價

12.6 數字圖像的隱藏技術

12.6.1 圖像融合技術簡介

12.6.2 基於混沌的圖像隱藏算法

12.6.3 圖形用戶界面設計

12.6.4 編碼實現

第13章 使用OpenCV處理數字圖像

13.1 OpenCV簡介

13.1.1 OpenCV的前世今生

13.1.2 OpenCV的諸多優點

13.1.3 OpenCV的命名規則

13.1.4 OpenCV的相關資源

13.1.5 OpenCV的安裝與配置

13.2 OpenCV的結構

13.2.1 OpenCV的體系結構

13.2.2 OpenCV的函式結構

13.2.3 OpenCV的功能結構

13.2.4 OpenCV的數據結構

13.3 利用OpenCV顯示圖像

13.3.1 圖像檔案的載入與顯示

13.3.2 圖像檔案的創建、保存和複製

13.4 套用OpenCV進行圖像平滑

13.4.1 功能函式描述

13.4.2 互動界面設計

13.4.3 編碼實現

13.5 套用OpenCV進行邊緣檢測

13.5.1 Canny準則

13.5.2 Canny算法簡介

13.5.3 在OpenCV中使用Canny算法

13.6 套用OpenCV進行形態學處理

13.6.1 功能函式描述

13.6.2 互動界面設計

13.6.3 編碼實現

13.7 在OpenCV中套用Hough變換

13.7.1 功能函式描述

13.7.2 互動界面設計

13.7.3 編碼實現

13.8 靜態人臉檢測程式的實現

13.8.1 人臉檢測概述

13.8.2 算法分析

13.8.3 編程實現

第14章 使用ImageMagick處理圖像

14.1 ImageMagick簡介

14.1.1 處理數字圖像的利器——ImageMagick

14.1.2 ImageMagick的特性和功能

14.1.3 Magick++

14.2 ImageMagick的使用配置

14.2.1 下載ImageMagick

14.2.2 編譯ImageMagick

14.2.3 配置ImageMagick環境

14.3 Magick++基礎

14.3.1 第一個Magick++程式

14.3.2 Magick++的核心——Image對象

14.3.3 Color對象

14.3.4 Geometry對象

14.4 初探Magick++

14.4.1 圖像的縮放

14.4.2 圖像的旋轉

14.4.3 剪裁圖像

14.4.4 矩陣變換

14.4.5 圖像的鏡像和滾動

14.5 使用Magick++對圖像進行增強處理

14.5.1 調整圖像的基本屬性

14.5.2 高斯平滑

14.5.3 銳化

14.5.4 去除圖像的噪點

14.6 使用Magick++實現圖像特效

14.6.1 運動模糊特效

14.6.2 黑洞特效

14.6.3 浮雕效果

14.6.4 油畫效果

14.6.5 陰影效果

14.6.6 旋渦效果

14.7 其他Magick++用法

14.7.1 種子填充

14.7.2 批量處理

14.7.3 真彩色轉256色

14.7.4 圖像合成

14.7.5 ImageMagick的C語言接口

參考文獻

相關詞條

熱門詞條

聯絡我們