本書全面系統地講述了數字圖像處理領域中的15大核心話題,包括色彩空間、圖像編碼、頻域變換、圖像檔案格式、幾何變換、灰度變換、圖像的增強處理、邊緣檢測、輪廓跟蹤、形態學處理、圖像分割、圖像的加密與隱藏、小波變換、偏微分方程以及圖像去噪等。為了便於學習與實踐,基於自行開發的MagicHouse平台,本書提供了全部算法的完整編碼實現,並在Visual C++ 2005環境下調試通過。藉此,本書也向讀者全面詳盡地介紹了Visual C++下進行數字圖像處理編程的技術和方法。
基本介紹
- 書名:數字圖像處理技術詳解與Visual C
- 類型:計算機與網際網路
- 出版日期:2014年3月1日
- 語種:簡體中文
- ISBN:7121224836
- 作者:左飛
- 出版社:電子工業出版社
- 頁數:591頁
- 開本:16
- 品牌:電子工業出版社
基本介紹,內容簡介,作者簡介,圖書目錄,序言,
基本介紹
內容簡介
《數字圖像處理:技術詳解與Visual C++實踐》編輯推薦:《數字圖像處理:技術詳解與Visual C++實踐》為了便於學習與實踐,基於自行開發的MagicHouse平台,《數字圖像處理:技術詳解與Visual C++實踐》提供了全部算法的完整編碼實現,並在Visual C++ 2005環境下調試通過。藉此,《數字圖像處理:技術詳解與Visual C++實踐》也向讀者全面詳盡地介紹了Visual C++下進行數字圖像處理編程的技術和方法。
作者簡介
服務於中國規模最大的移動通信運營商,業餘時間他撰寫了多部計算機方面的著作,並譯有《編碼》、《提高C++性能的編程技術》等經典名著。
圖書目錄
第1章 緒論
1.1 數字圖像處理概述
1.1.1 圖像與數字圖像
1.1.2 數字圖像處理研究的內容
1.1.3 數字圖像處理的套用
1.2 Visual C++概述
1.2.1 Visual C++簡介
1.2.2 卓越的集成開發環境
1.3 在Visual C++中處理數字圖像
1.3.1 點陣圖和調色板
1.3.2 圖形設備接口
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.1.4 有記憶高斯信源
3.2 圖像的壓縮編碼
3.2.1 行程編碼
3.2.2 LZW編碼
3.2.3 霍夫曼編碼
3.3 傅立葉變換
3.3.1 傅立葉變換的數學基礎
3.3.2 傅立葉變換與傅立葉級數的關係
3.3.3 數字圖像的傅立葉變換
3.3.4 快速傅立葉變換的算法
3.3.5 編程實現圖像的快速傅立葉變換
3.4 離散餘弦變換
3.4.1 基本概念及數學描述
3.4.2 離散餘弦變換的意義
3.4.3 離散餘弦變換的實現
3.5 子帶編碼
3.5.1 數位訊號處理基礎
3.5.2 多抽樣率信號處理
3.5.3 圖像的子帶分解
第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 本章實例:類似ACDSee的圖像瀏覽工具
5.6.1 實例預覽
5.6.2 概要設計
5.6.3 完成實例編碼
第6章 圖像檔案的格式
6.1 圖像檔案概述
6.1.1 圖像檔案
6.1.2 圖像檔案的一般結構
6.1.3 圖像檔案的常用參數
6.2 BMP檔案格式
6.2.1 檔案結構
6.2.2 檔案頭和信息頭
6.2.3 主要參數
6.3 GIF檔案格式
6.3.1 GIF格式簡介
6.3.2 GIF檔案結構
6.3.3 GIF檔案塊的結構
6.3.4 在GDI+下播放GIF動畫
6.4 PNG檔案格式
6.4.1 PNG格式簡介
6.4.2 PNG檔案結構
6.4.3 PNG中的關鍵數據塊
6.5 JPEG檔案及其編解碼的實現
6.5.1 JPEG檔案概述
6.5.2 JPEG的編解碼原理
6.5.3 JPEG檔案格式
6.5.4 JPEG解碼程式的實現
第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.3 圖像的高斯平滑
9.3.1 平滑線性濾波器
9.3.2 高斯平滑的原理
9.3.3 高斯分布
9.3.4 高斯平滑的算法實現
9.4 圖像的中值濾波
9.4.1 統計排序濾波器
9.4.2 圖像中值濾波的原理
9.4.3 圖像中值濾波的算法實現
9.5 圖像的拉普拉斯銳化
9.5.1 圖像的銳化
9.5.2 拉普拉斯銳化的原理
9.5.3 拉普拉斯銳化的算法實現
9.6 Sobel邊緣細化
9.6.1 Sobel邊緣細化的原理
9.6.2 Sobel邊緣細化的算法實現
第10章 圖像的形態學處理
10.1 數學形態學
10.2 一些必要的概念和符號約定
10.3 圖像的腐蝕
10.3.1 腐蝕原理
10.3.2 編程實現
10.4 圖像的膨脹
10.4.1 膨脹原理
10.4.2 編程實現
10.5 腐蝕和膨脹的性質及套用
10.5.1 腐蝕和膨脹的代數性質
10.5.2 腐蝕和膨脹的套用
10.6 開運算和閉運算
10.6.1 開運算
10.6.2 閉運算
10.6.3 編程實現
10.6.4 開運算和閉運算的代數性質
10.7 圖像形態學的其他運算
10.7.1 擊中/不擊中運算
10.7.2 細化處理
第11章 圖像的邊緣和輪廓
11.1 邊緣檢測
11.1.1 邊緣檢測的基本概念
11.1.2 常規邊緣檢測
11.1.3 帶方向的邊緣檢測
11.1.4 拉普拉斯運算元
11.2 Hough變換
11.2.1 平面坐標系的轉換
11.2.2 Hough變換的思想
11.2.3 直線的Hough變換
11.2.4 圓的Hough變換
11.2.5 彩色圖像的Hough變換
11.3 種子算法
11.3.1 算法介紹
11.3.2 編程實現
11.4 輪廓跟蹤
11.4.1 區域表示方法
11.4.2 計算區域的面積和周長
11.4.3 單區域跟蹤
11.4.4 多區域跟蹤
11.5 基於形態學分水嶺的圖像分割
11.5.1 基本概念
11.5.2 分水嶺算法
11.5.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章 小波變換及其套用
13.1 哈爾函式與哈爾變換
13.1.1 哈爾函式的定義
13.1.2 哈爾函式的性質
13.1.3 酉矩陣與酉變換
13.1.4 二維離散線性變換
13.1.5 哈爾基函式
13.1.6 哈爾變換
13.2 小波的數學基礎
13.2.1 小波的歷史
13.2.2 理解小波的概念
13.2.3 多解析度分析
13.2.4 小波函式的構建
13.2.5 小波序列展開
13.2.6 離散小波變換
13.2.7 連續小波變換
13.2.8 小波的容許條件與基本特徵
13.3 快速小波變換
13.3.1 快速小波正變換
13.3.2 快速小波逆變換
13.3.3 圖像的小波變換
13.4 小波在圖像處理中的套用
第14章 偏微分方程與圖像降噪
14.1 PM方程及其套用
14.1.1 一維熱傳導方程
14.1.2 各向異性擴散方程
14.1.3 PM擴散方程的實現
14.1.4 加性運算元分裂
14.2 TV方法及其套用
14.2.1 泛函與變分法
14.2.2 全變分模型
14.2.3 TV算法的數值實現
14.2.4 基於TV的圖像降噪實例
1.1 數字圖像處理概述
1.1.1 圖像與數字圖像
1.1.2 數字圖像處理研究的內容
1.1.3 數字圖像處理的套用
1.2 Visual C++概述
1.2.1 Visual C++簡介
1.2.2 卓越的集成開發環境
1.3 在Visual C++中處理數字圖像
1.3.1 點陣圖和調色板
1.3.2 圖形設備接口
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.1.4 有記憶高斯信源
3.2 圖像的壓縮編碼
3.2.1 行程編碼
3.2.2 LZW編碼
3.2.3 霍夫曼編碼
3.3 傅立葉變換
3.3.1 傅立葉變換的數學基礎
3.3.2 傅立葉變換與傅立葉級數的關係
3.3.3 數字圖像的傅立葉變換
3.3.4 快速傅立葉變換的算法
3.3.5 編程實現圖像的快速傅立葉變換
3.4 離散餘弦變換
3.4.1 基本概念及數學描述
3.4.2 離散餘弦變換的意義
3.4.3 離散餘弦變換的實現
3.5 子帶編碼
3.5.1 數位訊號處理基礎
3.5.2 多抽樣率信號處理
3.5.3 圖像的子帶分解
第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 本章實例:類似ACDSee的圖像瀏覽工具
5.6.1 實例預覽
5.6.2 概要設計
5.6.3 完成實例編碼
第6章 圖像檔案的格式
6.1 圖像檔案概述
6.1.1 圖像檔案
6.1.2 圖像檔案的一般結構
6.1.3 圖像檔案的常用參數
6.2 BMP檔案格式
6.2.1 檔案結構
6.2.2 檔案頭和信息頭
6.2.3 主要參數
6.3 GIF檔案格式
6.3.1 GIF格式簡介
6.3.2 GIF檔案結構
6.3.3 GIF檔案塊的結構
6.3.4 在GDI+下播放GIF動畫
6.4 PNG檔案格式
6.4.1 PNG格式簡介
6.4.2 PNG檔案結構
6.4.3 PNG中的關鍵數據塊
6.5 JPEG檔案及其編解碼的實現
6.5.1 JPEG檔案概述
6.5.2 JPEG的編解碼原理
6.5.3 JPEG檔案格式
6.5.4 JPEG解碼程式的實現
第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.3 圖像的高斯平滑
9.3.1 平滑線性濾波器
9.3.2 高斯平滑的原理
9.3.3 高斯分布
9.3.4 高斯平滑的算法實現
9.4 圖像的中值濾波
9.4.1 統計排序濾波器
9.4.2 圖像中值濾波的原理
9.4.3 圖像中值濾波的算法實現
9.5 圖像的拉普拉斯銳化
9.5.1 圖像的銳化
9.5.2 拉普拉斯銳化的原理
9.5.3 拉普拉斯銳化的算法實現
9.6 Sobel邊緣細化
9.6.1 Sobel邊緣細化的原理
9.6.2 Sobel邊緣細化的算法實現
第10章 圖像的形態學處理
10.1 數學形態學
10.2 一些必要的概念和符號約定
10.3 圖像的腐蝕
10.3.1 腐蝕原理
10.3.2 編程實現
10.4 圖像的膨脹
10.4.1 膨脹原理
10.4.2 編程實現
10.5 腐蝕和膨脹的性質及套用
10.5.1 腐蝕和膨脹的代數性質
10.5.2 腐蝕和膨脹的套用
10.6 開運算和閉運算
10.6.1 開運算
10.6.2 閉運算
10.6.3 編程實現
10.6.4 開運算和閉運算的代數性質
10.7 圖像形態學的其他運算
10.7.1 擊中/不擊中運算
10.7.2 細化處理
第11章 圖像的邊緣和輪廓
11.1 邊緣檢測
11.1.1 邊緣檢測的基本概念
11.1.2 常規邊緣檢測
11.1.3 帶方向的邊緣檢測
11.1.4 拉普拉斯運算元
11.2 Hough變換
11.2.1 平面坐標系的轉換
11.2.2 Hough變換的思想
11.2.3 直線的Hough變換
11.2.4 圓的Hough變換
11.2.5 彩色圖像的Hough變換
11.3 種子算法
11.3.1 算法介紹
11.3.2 編程實現
11.4 輪廓跟蹤
11.4.1 區域表示方法
11.4.2 計算區域的面積和周長
11.4.3 單區域跟蹤
11.4.4 多區域跟蹤
11.5 基於形態學分水嶺的圖像分割
11.5.1 基本概念
11.5.2 分水嶺算法
11.5.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章 小波變換及其套用
13.1 哈爾函式與哈爾變換
13.1.1 哈爾函式的定義
13.1.2 哈爾函式的性質
13.1.3 酉矩陣與酉變換
13.1.4 二維離散線性變換
13.1.5 哈爾基函式
13.1.6 哈爾變換
13.2 小波的數學基礎
13.2.1 小波的歷史
13.2.2 理解小波的概念
13.2.3 多解析度分析
13.2.4 小波函式的構建
13.2.5 小波序列展開
13.2.6 離散小波變換
13.2.7 連續小波變換
13.2.8 小波的容許條件與基本特徵
13.3 快速小波變換
13.3.1 快速小波正變換
13.3.2 快速小波逆變換
13.3.3 圖像的小波變換
13.4 小波在圖像處理中的套用
第14章 偏微分方程與圖像降噪
14.1 PM方程及其套用
14.1.1 一維熱傳導方程
14.1.2 各向異性擴散方程
14.1.3 PM擴散方程的實現
14.1.4 加性運算元分裂
14.2 TV方法及其套用
14.2.1 泛函與變分法
14.2.2 全變分模型
14.2.3 TV算法的數值實現
14.2.4 基於TV的圖像降噪實例
序言
1.引子
本書是“VisualC++數字圖像處理系列”的第三部。前兩部圖書《VisualC++數字圖像處理開發入門與編程實踐》和《數字圖像處理原理與實踐:基於VisualC++開發》自問世以來收穫了頗多肯定,許多讀者紛紛來信與筆者討論技術問題,交流心得感想。此外,據不完全統計,前兩部圖書的科技文獻參考引用量已經超過百餘篇次。從這個側面也可以看出有關書籍對讀者的學習和研究的確產生了一定積極的作用,或者說讀者能夠從書中獲得新知和啟迪,這也是一直鼓舞我們的動力所在。
這一系列的書,一脈相承,有著共同的基礎和相似的創作理念,但又各自有著不同的定位。《VisualC++數字圖像處理開發入門與編程實踐》是一本介紹如何運用VisualC++進行數字圖像處理編程的入門書籍。全書所涉及的相關圖像處理算法不是很多,而更多的篇幅則是在介紹如何用集成開發環境來進行編程。書中最鮮明的一個特點就是,即使在介紹圖像處理算法時,也極少出現數學公式。《數字圖像處理原理與實踐:基於VisualC++開發》相對於第一部圖書而言則提升了難度,涉及的問題也更廣。更重要的是,第二版更側重於實際開發,把在VisualC++中進行開發可能用到的一些函式館或者技術大概都講到了,包括設備無關點陣圖、GDI+、OpenCV和ImageMagick等。這些技術可以幫助讀者更快捷地完成開發任務,真正做到事半功倍。
與前兩部圖書相同,本書依然在自行開發的MagicHouse框架基礎上來向讀者介紹數字圖像處理的有關理論和方法。但本書的理論性更強,內容也更全面。相對而言,本書的難度也最大。出於篇幅以及難度等方面的考慮,前兩部圖書無法對相關理論成果進行面面俱到的介紹,本書在很大程度上彌補了這一不足。因此,本書在保持系列作品突出實踐的特色基礎之上,詳細地介紹了包括色彩空間、圖像編碼、頻域變換、圖像格式、幾何變換、灰度變換、形態學處理、圖像的增強處理、圖像的邊緣與輪廓檢測、圖像分割、圖像的加密與隱藏、小波變換和偏微分降噪等10多個主題,並配有完整的C++代碼。可以說,本書更適合期望對相關理論進行系統學習和深入研究的讀者。
2.VisualC++與Matlab
數字圖像處理在航空航天、地質勘探、醫療影像、工業控制和影音娛樂等領域有著非常廣泛的套用,同時也是大學相關專業高年級本科生和研究生的必修課。它常常與另外一門學科“計算機視覺”(或稱機器視覺)聯繫在一起。但通常數字圖像處理更側重於對於圖像的獲取、處理、傳輸和表達,而計算機視覺則更側重於對圖像的分析和理解(典型內容包括特徵分析和匹配、運動檢測等)。二者之所以有如此緊密的聯繫,是因為對圖像進行分析之前往往需要運用圖像處理的有關方法對圖像進行預處理。例如,運用SIFT算法進行特徵檢測之前,需要運用高斯濾波方法來構建多尺度空間。
大學裡許多專業都會學習圖像處理這門課程。從大的方面來說,主要是計算機專業和電子信息專業(其實很多套用數學專業的學生所從事的方向也是數字圖像處理)。如果去科技書店看看,你一定會發現,關於數字圖像處理開發方面的書籍主要分為兩大陣營,即VisualC++(或C/C++)和Matlab。而且就實際出版的圖書種類而言,Matlab更具統治地位。通常而言,計算機專業的學生更傾向於使用VisualC++,一方面,因為編程本來就應該是他們的基本功之一;另一方面,計算機專業往往不會開設Matlab相關課程。電子信息專業的學生則更傾向於Matlab,因為絕大部分這類專業在課程設定中都會有“信號與系統”和“數位訊號處理”課,而這些課在教學時往往需要學生使用Matlab來進行編程試驗。當然,這裡所說的僅僅是一般情況,不排除個別學校在具體教學安排中可能存在差異的情況。
其實說起VisualC++和Matlab在圖像處理領域的紛爭,二者應該是各有千秋。Matlab很適合做科學研究。用Matlab進行圖像處理編程通常更加容易,代碼也更簡短。這是因為Matlab中提供了許多現成的函式可以大大簡化開發過程,用Matlab開發甚至無須考慮記憶體的分配與回收問題。例如,本書的最後一章中給出了利用TV模型進行圖像降噪的原始碼。有心的讀者可以在網上搜尋一下,因為基於PDE的圖像處理技術對數學要求較高,因此相關資料並不多見。基於TV模型的降噪算法實現起來非常複雜,所以用C++寫出的代碼在網上幾乎找不到,能夠找到的幾個資源完全是基於Matlab的。這就是因為用Matlab寫,這個算法的實現編碼量會大大縮減。
相對而言,使用VisualC++進行圖像處理開發難度較大,需要考慮的問題更多,很多矩陣運算函式都需要自己編寫。讀入不同格式和類型的圖像數據,然後進行解碼這種問題也沒有現成的方法。但是,VisualC++在工業開發中則更實用,例如,它可以直接開發套用於工業系統的嵌入式程式。而Matlab開發的程式要想在實際中運用,諸如可移植性等問題表現欠佳。就學習而言,最初我建議大家應該從VisualC++入手。Matlab用起來很簡單、很方便,但是它掩蓋了太多細節,不利於讀者深入理解底層實現,也不利於讀者打好基礎。不積跬步,無以致千里。最初學習時如果基礎不打牢,後續再講什麼創新其實都是紙上談兵。在讀者對底層實現比較清楚的情況下,進行後續的科學研究時,再去考慮使用Matlab可能才是明智的選擇。
以圖像編解碼為例。在Matlab中,只需一個函式就能將圖片讀入,然後得到一個現成的像素矩陣。在這個過程中,就忽略了很多細節。而在VisualC++中,如果不調用現成的函式館(例如OpenCV),那么就需要自己編寫解碼函式。這時就不得不去考慮不同圖像格式的編碼方案和算法,考慮圖像檔案在存儲器上到底是如何存儲的等問題。這時才會知道原來圖像被寫進存儲器的時候不是簡簡單單的一個像素矩陣,原來還有調色板、檔案頭等內容。我經常喜歡拿武俠小說《天龍八部》中的一段情節來向讀者說明此中的道理,相信讀者對這部曾經被多次搬上銀幕的金庸作品已經耳熟能詳了。書中有個名叫鳩摩智的番僧一心想練就絕世武學,而且他也算是個相當勤奮的人了。但是,他錯就錯在太過於急功近利,甚至使用道家的小無相功來催動少林絕技。看上去威力無比,而且可以在短時間內“速成”,但實則後患無窮。最終鳩摩智走火入魔,武功盡失,前功盡廢,方才大徹大悟。這個故事告訴我們基礎其實非常重要,特別是要取得更長足的發展,就更是要對基本原理刨根問底,力求甚解,從而做到庖丁解牛,爛熟於心。
說到OpenCV,我也想再多談兩句。在VisualC++中引入OpenCV無疑會大大降低開發強度,基本上就可以跟使用Matlab的感覺差不多。這對那些並不十分熟悉Matlab,又苦於在VisualC++中進行圖像處理編程太煩瑣的開發人員來說,無疑是一個福音。在本系列的前兩部作品中,筆者都有專門的章節來對OpenCV進行解釋。當然,一方面,因為OpenCV本身內容就比較多;另一方面,OpenCV的版本還在不斷地更新,容量也在不斷地擴充,因此實在難於一言以蔽之。所以,筆者也只不過是拋磚引玉了。如果專門講OpenCV,則完全可以寫一本書。現在專門介紹OpenCV的書很多,所以還是那句話:如果讀者對於底層原理已經比較了解,但是對Matlab不是特別熟悉,那么完全可以在VisualC++中結合OpenCV進行編程開發。
3.天書VS兒歌三百首
數字圖像處理的理論基礎主要就是數學,而數學本身又是一個極其龐雜的系統,它的分支層出不窮,不計其數。讀者現在所要學習的數字圖像處理,至少涉及數學中三門主幹的內容,即高等數學、線性代數和機率論。在本書中,讀者會發現這些內容幾乎無處不在,以高等數學中的泰勒公式為例,本書中就至少用到過三次。除了上述提到的大家在本科階段就應學過的三門數學課程之外,本書還用到了複變函數、偏微分方程、泛函理論等內容。從這個角度說,數字圖像處理對於很多學生而言,無異於“天書”。
不得不說現在很多學生都非常浮躁,做學問不求甚解,還妄圖一蹴而就。學知識也是蜻蜓點水、淺嘗輒止,看東西則是走馬觀花、浮光掠影,很難安下心來仔細研究。如果你寫得比較專業,過於陽春白雪,那顯然會看得人暈頭轉向,不知所云。但是如果你寫得很通俗、很淺顯,又會有人覺得自己都看懂了,就開始自以為是、洋洋得意起來,甚至會覺是作者水平太差,寫的書都這么簡單。對於這些人,我想借用毛主席的話來勸誡他們:“務必使同志們繼續保持謙虛、謹慎、不驕、不躁的作風。”
霍金也說:“在書中每增加一條公式,讀者就會流失一半”。如果你現在手捧著的是這樣一部由公式羅列而成的天書,相信很多讀者都會望而卻步。本系列的第一部圖書正是出於難度的考慮,大大削減了出現在書中的數學公式,如此一來,一些較為艱深的內容也一併被切掉了。當然,數學公式亦有數學公式的好處。從數學角度解釋圖像處理算法的原理,是深入到了算法本質層面的。如果不談任何公式,然後把如何處理一張圖片的方法用文字描述的方式告訴讀者也不是不可能的,但是這其實只是讓讀者“知其然而不知其所以然”。這樣的弊端就在於讀者想進行更為深入的研究時,幾乎難如登天。那么有沒有什麼方法能夠緩和這兩者之間的矛盾,而把“天書”寫得如同《兒歌三百首》一樣通俗易懂呢?
筆者一直以把複雜晦澀的理論寫得深入淺出、淺顯明了為終極目標。但是要做到這一點實非易事,為此筆者也進行了諸多探索。本書公式集中爆發在三個章節,這三個章節自也是全書最為複雜的部分,往往是讀者學習上的薄弱環節和理解上的峻岭鴻溝。但本書絕非僅僅是簡單地羅列公式,為了幫助讀者打牢根基,融會貫通,在寫本書時,筆者主要做了三項工作:首先,給足背景的鋪墊,而非憑空丟來一個公式。例如,本書在介紹PM方程時,為了讓讀者能夠真正理解它的原理,筆者是從一個簡單的物理現象開始一步步引導讀者進行學習的;其次,在給出公式的同時,筆者基本都給出了最為淺顯的證明過程,而且力求過程之詳細。例如,在率失真理論的介紹中,對於這部分公式的證明,國內教材都是以詹森不等式為基礎的,但是讀者不禁又困惑了,詹森不等式為什麼會成立呢?所以筆者在這些地方完全摒棄了詹森不等式,而是用初等數學中的基本不等式來開展有關證明,這無疑會大大減少讀者心中的困惑;最後,在某些時候我們可能需要的是嚴密的數學證明,而有些時候可能需要的是感性的認識。筆者試圖將兩者有機地結合在一起,需要嚴密的時候就儘量嚴密,需要感性的時候就努力感性。例如,我們在推導歐拉-拉格朗日方程時,其實證明過程並不完全嚴格,但是從讀者對於該公式的理解以及後續學習的可開展性上,這種程度的解釋可能才是最佳的方式。
儘管為了能把理論講得更明白、更透徹,筆者查閱了許多資料,進行了諸多求索,但科技文章寫作永遠是留有遺憾的藝術。可能本書仍有許多未盡之處,可能本書還不能完全把天書降低到兒歌三百首那種地步,但筆者相信只要讀者能夠仔細研究,定能有所長進,有所收穫。
4.關於本書
本書既強調對於理論知識的深刻領悟,又突出編程實踐的重要意義,為此配有大量的實例代碼供讀者參考學習。這些代碼均是在MagicHouse框架下完成的。MagicHouse是筆者在VisualC++下開發的一個數字圖像處理的算法試驗平台。它可以從存儲器上讀取兩種格式(BMP和JPG)的圖像,然後將圖像解碼成一個數組(也就是一個像素矩陣),再用一個指針指向它。開發者只要針對這個像素矩陣進行變換,MagicHouse便可以將運算結果顯示在螢幕上或者以兩種格式中的任意一種存儲在磁碟上。因此,在這個框架下進行算法試驗是非常方便的。我們前面也講過,對於圖像讀入並解碼也是讀者應該掌握的知識(當然還包括圖像格式中色彩空間的使用),因此筆者也會帶領讀者一步步地完成MagicHouse的搭建和編碼。這個過程本身也是砥礪編程能力、夯實知識基礎的過程。
白居易說:“文章合為時而著,歌詩合為事而作。”他的意思是說,不管是寫詩還是做文章都要有現實意義。其實寫圖像處理這方面的書也差不多得有點這種境界。圖像處理是一個發展非常迅猛的領域,每天都有新方法、新理論誕生,讀者當然不能總是在學最原始、最簡單的那點東西。本書最後的一部分內容,包括圖像的加密與隱藏、小波變換和基於偏微分方程的圖像降噪,儘管已經取得了長足的發展,但仍然是理論界的熱門話題。這部分也是建議讀者重點研習的部分。特別是其中關於圖像的加密與隱藏和偏微分方程圖像處理方法的資料在國內仍然很少,而小波變換和基於偏微分方程的套用由於對數學的要求較高,也一直令很多人不得要領。本書在這些內容上花費了大量的筆墨,就是希望能夠幫助讀者叩開久閉的山門,同時也希望為讀者挺進這些方興未艾的領域披荊斬棘、掃除障礙。
本書由左飛統籌並執筆,萬晉森和劉航參與了部分章節的撰寫。具體分工是,左飛負責撰寫第1~4章、第6章、第9章的部分和第12~14章;萬晉森撰寫了第5章、第7章和第8章;劉航撰寫了第9章的大部分和第10章、第11章。歡迎讀者就書中的問題同筆者展開交流,具體請訪問筆者在CSDN上的部落格,關於本書的勘誤和補遺也將實時發布在此部落格上。
自知論道需思量,幾度無眠一文章。由於時間和能力有限,書中紕漏在所難免,真誠
地希望各位讀者和專家不吝批評斧正。
本書是“VisualC++數字圖像處理系列”的第三部。前兩部圖書《VisualC++數字圖像處理開發入門與編程實踐》和《數字圖像處理原理與實踐:基於VisualC++開發》自問世以來收穫了頗多肯定,許多讀者紛紛來信與筆者討論技術問題,交流心得感想。此外,據不完全統計,前兩部圖書的科技文獻參考引用量已經超過百餘篇次。從這個側面也可以看出有關書籍對讀者的學習和研究的確產生了一定積極的作用,或者說讀者能夠從書中獲得新知和啟迪,這也是一直鼓舞我們的動力所在。
這一系列的書,一脈相承,有著共同的基礎和相似的創作理念,但又各自有著不同的定位。《VisualC++數字圖像處理開發入門與編程實踐》是一本介紹如何運用VisualC++進行數字圖像處理編程的入門書籍。全書所涉及的相關圖像處理算法不是很多,而更多的篇幅則是在介紹如何用集成開發環境來進行編程。書中最鮮明的一個特點就是,即使在介紹圖像處理算法時,也極少出現數學公式。《數字圖像處理原理與實踐:基於VisualC++開發》相對於第一部圖書而言則提升了難度,涉及的問題也更廣。更重要的是,第二版更側重於實際開發,把在VisualC++中進行開發可能用到的一些函式館或者技術大概都講到了,包括設備無關點陣圖、GDI+、OpenCV和ImageMagick等。這些技術可以幫助讀者更快捷地完成開發任務,真正做到事半功倍。
與前兩部圖書相同,本書依然在自行開發的MagicHouse框架基礎上來向讀者介紹數字圖像處理的有關理論和方法。但本書的理論性更強,內容也更全面。相對而言,本書的難度也最大。出於篇幅以及難度等方面的考慮,前兩部圖書無法對相關理論成果進行面面俱到的介紹,本書在很大程度上彌補了這一不足。因此,本書在保持系列作品突出實踐的特色基礎之上,詳細地介紹了包括色彩空間、圖像編碼、頻域變換、圖像格式、幾何變換、灰度變換、形態學處理、圖像的增強處理、圖像的邊緣與輪廓檢測、圖像分割、圖像的加密與隱藏、小波變換和偏微分降噪等10多個主題,並配有完整的C++代碼。可以說,本書更適合期望對相關理論進行系統學習和深入研究的讀者。
2.VisualC++與Matlab
數字圖像處理在航空航天、地質勘探、醫療影像、工業控制和影音娛樂等領域有著非常廣泛的套用,同時也是大學相關專業高年級本科生和研究生的必修課。它常常與另外一門學科“計算機視覺”(或稱機器視覺)聯繫在一起。但通常數字圖像處理更側重於對於圖像的獲取、處理、傳輸和表達,而計算機視覺則更側重於對圖像的分析和理解(典型內容包括特徵分析和匹配、運動檢測等)。二者之所以有如此緊密的聯繫,是因為對圖像進行分析之前往往需要運用圖像處理的有關方法對圖像進行預處理。例如,運用SIFT算法進行特徵檢測之前,需要運用高斯濾波方法來構建多尺度空間。
大學裡許多專業都會學習圖像處理這門課程。從大的方面來說,主要是計算機專業和電子信息專業(其實很多套用數學專業的學生所從事的方向也是數字圖像處理)。如果去科技書店看看,你一定會發現,關於數字圖像處理開發方面的書籍主要分為兩大陣營,即VisualC++(或C/C++)和Matlab。而且就實際出版的圖書種類而言,Matlab更具統治地位。通常而言,計算機專業的學生更傾向於使用VisualC++,一方面,因為編程本來就應該是他們的基本功之一;另一方面,計算機專業往往不會開設Matlab相關課程。電子信息專業的學生則更傾向於Matlab,因為絕大部分這類專業在課程設定中都會有“信號與系統”和“數位訊號處理”課,而這些課在教學時往往需要學生使用Matlab來進行編程試驗。當然,這裡所說的僅僅是一般情況,不排除個別學校在具體教學安排中可能存在差異的情況。
其實說起VisualC++和Matlab在圖像處理領域的紛爭,二者應該是各有千秋。Matlab很適合做科學研究。用Matlab進行圖像處理編程通常更加容易,代碼也更簡短。這是因為Matlab中提供了許多現成的函式可以大大簡化開發過程,用Matlab開發甚至無須考慮記憶體的分配與回收問題。例如,本書的最後一章中給出了利用TV模型進行圖像降噪的原始碼。有心的讀者可以在網上搜尋一下,因為基於PDE的圖像處理技術對數學要求較高,因此相關資料並不多見。基於TV模型的降噪算法實現起來非常複雜,所以用C++寫出的代碼在網上幾乎找不到,能夠找到的幾個資源完全是基於Matlab的。這就是因為用Matlab寫,這個算法的實現編碼量會大大縮減。
相對而言,使用VisualC++進行圖像處理開發難度較大,需要考慮的問題更多,很多矩陣運算函式都需要自己編寫。讀入不同格式和類型的圖像數據,然後進行解碼這種問題也沒有現成的方法。但是,VisualC++在工業開發中則更實用,例如,它可以直接開發套用於工業系統的嵌入式程式。而Matlab開發的程式要想在實際中運用,諸如可移植性等問題表現欠佳。就學習而言,最初我建議大家應該從VisualC++入手。Matlab用起來很簡單、很方便,但是它掩蓋了太多細節,不利於讀者深入理解底層實現,也不利於讀者打好基礎。不積跬步,無以致千里。最初學習時如果基礎不打牢,後續再講什麼創新其實都是紙上談兵。在讀者對底層實現比較清楚的情況下,進行後續的科學研究時,再去考慮使用Matlab可能才是明智的選擇。
以圖像編解碼為例。在Matlab中,只需一個函式就能將圖片讀入,然後得到一個現成的像素矩陣。在這個過程中,就忽略了很多細節。而在VisualC++中,如果不調用現成的函式館(例如OpenCV),那么就需要自己編寫解碼函式。這時就不得不去考慮不同圖像格式的編碼方案和算法,考慮圖像檔案在存儲器上到底是如何存儲的等問題。這時才會知道原來圖像被寫進存儲器的時候不是簡簡單單的一個像素矩陣,原來還有調色板、檔案頭等內容。我經常喜歡拿武俠小說《天龍八部》中的一段情節來向讀者說明此中的道理,相信讀者對這部曾經被多次搬上銀幕的金庸作品已經耳熟能詳了。書中有個名叫鳩摩智的番僧一心想練就絕世武學,而且他也算是個相當勤奮的人了。但是,他錯就錯在太過於急功近利,甚至使用道家的小無相功來催動少林絕技。看上去威力無比,而且可以在短時間內“速成”,但實則後患無窮。最終鳩摩智走火入魔,武功盡失,前功盡廢,方才大徹大悟。這個故事告訴我們基礎其實非常重要,特別是要取得更長足的發展,就更是要對基本原理刨根問底,力求甚解,從而做到庖丁解牛,爛熟於心。
說到OpenCV,我也想再多談兩句。在VisualC++中引入OpenCV無疑會大大降低開發強度,基本上就可以跟使用Matlab的感覺差不多。這對那些並不十分熟悉Matlab,又苦於在VisualC++中進行圖像處理編程太煩瑣的開發人員來說,無疑是一個福音。在本系列的前兩部作品中,筆者都有專門的章節來對OpenCV進行解釋。當然,一方面,因為OpenCV本身內容就比較多;另一方面,OpenCV的版本還在不斷地更新,容量也在不斷地擴充,因此實在難於一言以蔽之。所以,筆者也只不過是拋磚引玉了。如果專門講OpenCV,則完全可以寫一本書。現在專門介紹OpenCV的書很多,所以還是那句話:如果讀者對於底層原理已經比較了解,但是對Matlab不是特別熟悉,那么完全可以在VisualC++中結合OpenCV進行編程開發。
3.天書VS兒歌三百首
數字圖像處理的理論基礎主要就是數學,而數學本身又是一個極其龐雜的系統,它的分支層出不窮,不計其數。讀者現在所要學習的數字圖像處理,至少涉及數學中三門主幹的內容,即高等數學、線性代數和機率論。在本書中,讀者會發現這些內容幾乎無處不在,以高等數學中的泰勒公式為例,本書中就至少用到過三次。除了上述提到的大家在本科階段就應學過的三門數學課程之外,本書還用到了複變函數、偏微分方程、泛函理論等內容。從這個角度說,數字圖像處理對於很多學生而言,無異於“天書”。
不得不說現在很多學生都非常浮躁,做學問不求甚解,還妄圖一蹴而就。學知識也是蜻蜓點水、淺嘗輒止,看東西則是走馬觀花、浮光掠影,很難安下心來仔細研究。如果你寫得比較專業,過於陽春白雪,那顯然會看得人暈頭轉向,不知所云。但是如果你寫得很通俗、很淺顯,又會有人覺得自己都看懂了,就開始自以為是、洋洋得意起來,甚至會覺是作者水平太差,寫的書都這么簡單。對於這些人,我想借用毛主席的話來勸誡他們:“務必使同志們繼續保持謙虛、謹慎、不驕、不躁的作風。”
霍金也說:“在書中每增加一條公式,讀者就會流失一半”。如果你現在手捧著的是這樣一部由公式羅列而成的天書,相信很多讀者都會望而卻步。本系列的第一部圖書正是出於難度的考慮,大大削減了出現在書中的數學公式,如此一來,一些較為艱深的內容也一併被切掉了。當然,數學公式亦有數學公式的好處。從數學角度解釋圖像處理算法的原理,是深入到了算法本質層面的。如果不談任何公式,然後把如何處理一張圖片的方法用文字描述的方式告訴讀者也不是不可能的,但是這其實只是讓讀者“知其然而不知其所以然”。這樣的弊端就在於讀者想進行更為深入的研究時,幾乎難如登天。那么有沒有什麼方法能夠緩和這兩者之間的矛盾,而把“天書”寫得如同《兒歌三百首》一樣通俗易懂呢?
筆者一直以把複雜晦澀的理論寫得深入淺出、淺顯明了為終極目標。但是要做到這一點實非易事,為此筆者也進行了諸多探索。本書公式集中爆發在三個章節,這三個章節自也是全書最為複雜的部分,往往是讀者學習上的薄弱環節和理解上的峻岭鴻溝。但本書絕非僅僅是簡單地羅列公式,為了幫助讀者打牢根基,融會貫通,在寫本書時,筆者主要做了三項工作:首先,給足背景的鋪墊,而非憑空丟來一個公式。例如,本書在介紹PM方程時,為了讓讀者能夠真正理解它的原理,筆者是從一個簡單的物理現象開始一步步引導讀者進行學習的;其次,在給出公式的同時,筆者基本都給出了最為淺顯的證明過程,而且力求過程之詳細。例如,在率失真理論的介紹中,對於這部分公式的證明,國內教材都是以詹森不等式為基礎的,但是讀者不禁又困惑了,詹森不等式為什麼會成立呢?所以筆者在這些地方完全摒棄了詹森不等式,而是用初等數學中的基本不等式來開展有關證明,這無疑會大大減少讀者心中的困惑;最後,在某些時候我們可能需要的是嚴密的數學證明,而有些時候可能需要的是感性的認識。筆者試圖將兩者有機地結合在一起,需要嚴密的時候就儘量嚴密,需要感性的時候就努力感性。例如,我們在推導歐拉-拉格朗日方程時,其實證明過程並不完全嚴格,但是從讀者對於該公式的理解以及後續學習的可開展性上,這種程度的解釋可能才是最佳的方式。
儘管為了能把理論講得更明白、更透徹,筆者查閱了許多資料,進行了諸多求索,但科技文章寫作永遠是留有遺憾的藝術。可能本書仍有許多未盡之處,可能本書還不能完全把天書降低到兒歌三百首那種地步,但筆者相信只要讀者能夠仔細研究,定能有所長進,有所收穫。
4.關於本書
本書既強調對於理論知識的深刻領悟,又突出編程實踐的重要意義,為此配有大量的實例代碼供讀者參考學習。這些代碼均是在MagicHouse框架下完成的。MagicHouse是筆者在VisualC++下開發的一個數字圖像處理的算法試驗平台。它可以從存儲器上讀取兩種格式(BMP和JPG)的圖像,然後將圖像解碼成一個數組(也就是一個像素矩陣),再用一個指針指向它。開發者只要針對這個像素矩陣進行變換,MagicHouse便可以將運算結果顯示在螢幕上或者以兩種格式中的任意一種存儲在磁碟上。因此,在這個框架下進行算法試驗是非常方便的。我們前面也講過,對於圖像讀入並解碼也是讀者應該掌握的知識(當然還包括圖像格式中色彩空間的使用),因此筆者也會帶領讀者一步步地完成MagicHouse的搭建和編碼。這個過程本身也是砥礪編程能力、夯實知識基礎的過程。
白居易說:“文章合為時而著,歌詩合為事而作。”他的意思是說,不管是寫詩還是做文章都要有現實意義。其實寫圖像處理這方面的書也差不多得有點這種境界。圖像處理是一個發展非常迅猛的領域,每天都有新方法、新理論誕生,讀者當然不能總是在學最原始、最簡單的那點東西。本書最後的一部分內容,包括圖像的加密與隱藏、小波變換和基於偏微分方程的圖像降噪,儘管已經取得了長足的發展,但仍然是理論界的熱門話題。這部分也是建議讀者重點研習的部分。特別是其中關於圖像的加密與隱藏和偏微分方程圖像處理方法的資料在國內仍然很少,而小波變換和基於偏微分方程的套用由於對數學的要求較高,也一直令很多人不得要領。本書在這些內容上花費了大量的筆墨,就是希望能夠幫助讀者叩開久閉的山門,同時也希望為讀者挺進這些方興未艾的領域披荊斬棘、掃除障礙。
本書由左飛統籌並執筆,萬晉森和劉航參與了部分章節的撰寫。具體分工是,左飛負責撰寫第1~4章、第6章、第9章的部分和第12~14章;萬晉森撰寫了第5章、第7章和第8章;劉航撰寫了第9章的大部分和第10章、第11章。歡迎讀者就書中的問題同筆者展開交流,具體請訪問筆者在CSDN上的部落格,關於本書的勘誤和補遺也將實時發布在此部落格上。
自知論道需思量,幾度無眠一文章。由於時間和能力有限,書中紕漏在所難免,真誠
地希望各位讀者和專家不吝批評斧正。