跳轉到內容

MATLAB 程式設計/高階主題/工具箱和擴充套件/影像處理工具箱

來自華夏公益教科書,開放書籍,為開放世界

影像處理工具箱簡介

[編輯 | 編輯原始碼]

核心 MATLAB 包附帶了一些基本的函式(將在後面介紹),這些函式可用於載入、儲存影像以及對影像執行自定義函式。但是,通常需要對影像執行更復雜的操作。影像處理工具箱允許進行以下操作:

  • 在 MATLAB 中直接視覺化影像
  • 色彩空間轉換(例如,在 RGBHSVL*a*b* 等之間轉換)
  • 物件分組和資料收集
  • 濾波和快速卷積
  • 影像的傅立葉分析
  • 影像算術
  • 形態學操作

以及其他許多操作。


Clipboard

待辦事項
這是一個相當不完整的介紹,擴充套件它以包含工具箱的其他功能


MATLAB 內建函式

[編輯 | 編輯原始碼]

要將影像載入到 MATLAB 中,您可以使用“匯入資料”GUI(與文字檔案或類似檔案相同),也可以使用“imread”函式。要使用“imread”,您必須將影像所在的目錄新增到目錄列表中。然後使用以下語法:

>> myimage = imread('myimage.extension');

建議使用分號,尤其是這裡,因為影像包含大量資料。

如果影像為彩色影像,MATLAB 預設情況下會將影像資料轉換為 RGB 色彩空間(對於大多數與之相容的資料格式)。單獨的通道由影像的第三維表示。以下程式碼分離了影像的通道並指示每個通道的顏色。

>> redchannel = myimage(:,:,1);
>> greenchannel = myimage(:,:,2);
>> bluechannel = myimage(:,:,3);

注意
在對影像進行計算時必須小心,因為大多數影像格式都以 UINT8 類匯入,而不是以 double 類匯入,以節省空間。許多操作不能在 UINT8 陣列(或多於兩個維度的陣列)上執行。其中一些可以透過使用 MATLAB 的影像算術函式來避免,但有時需要將影像或影像的一部分轉換為double 類才能對其進行操作。

MATLAB 中的另一個預設函式可用於將影像儲存到新檔案。函式“imwrite”接受兩種不同的語法:

>> imwrite(myimage, 'nameoffile.extension')

或者

>> imwrite(myimage, 'nameoffile', 'extension')

使用第二種語法時,不要在副檔名之前使用句點。有關匯入和匯出的支援檔案型別,請參見 MATLAB 文件。

MATLAB 的影像算術函式

[編輯 | 編輯原始碼]

預設情況下,MATLAB 將大多數影像匯入為uint8 類,該類不受原生加法、減法、乘法或除法函式的支援。為了克服這個問題,一種選擇是將影像轉換為double 類。但是,如果要使用大量影像,或者影像很大,這會導致記憶體問題。這也很慢。因此,MATLAB 在其算術函式中提供了一個更好的選擇。MATLAB 可以使用其專門用於整數的算術函式執行以下操作(如果 A 或 B 為常量值,它們也適用):

  • imadd(A, B):新增兩個影像 A 和 B(相當於 A + B,由於運算子過載,但這種語法在沒有影像分析工具箱的情況下不起作用,因此不建議使用,因為它在沒有工具箱的情況下會導致更難跟蹤的錯誤,而不是“函式未找到”)
  • imsubtract(A, B):減去兩個影像 A 和 B(相當於 A - B,但同樣不推薦使用,因為它在沒有工具箱的情況下不起作用)
  • immultiply(A, B):兩個影像 A 和 B 的元素乘法。相當於 A.*B。
  • imdivide(A, B):兩個影像 A 和 B 的元素除法。相當於 A./B
  • imlincomb(K1, A1, K2, A2, ..., C):影像 A1、A2 等的線性組合。這意味著您最終會得到 . 這比使用例如 更有效,因為後者在每次操作後都會進行舍入,這會導致有時會產生明顯的錯誤,而前者只在最後進行舍入。

影像視覺化

[編輯 | 編輯原始碼]

要視覺化影像或影像的一部分,請使用imshow 函式:

>> imshow(myimage);

這將顯示影像的圖形(通常縮小)。您不應該嘗試複製此影像並將其貼上到另一個程式中,因為生成的 RGB 值將不同。請改用 imwrite。

色彩空間轉換和 cform

[編輯 | 編輯原始碼]
Clipboard

待辦事項
描述“makecform”函式、cform 結構的格式以及如何執行此函式提供的色彩轉換


關於色彩空間轉換的說明

[編輯 | 編輯原始碼]

請注意,從 RGB 等裝置特定的色彩空間轉換為 LAB 或 XYZ 等非裝置特定的空間時,不可避免地會產生一些誤差。原因之一是 MATLAB 提供的 RGB 值通常使用來自相機的伽馬進行編碼(並在顯示在螢幕上之前由顯示器提供另一個伽馬),這使得 RGB 和 LAB 值之間的關係取決於相機的內部結構,並且是非線性的(且難以準確確定)。作為近似值,人們通常可以使用冪律函式來獲得未修改的 RGB 值,理論上這些值應該與每個畫素的 LAB 值線性相關。

請注意,這些方程式假設 R、G 和 B 的範圍在 0 到 255 之間,計算需要將 R、G 和 B 從預設的 uint8 類轉換為 double 類。

影像濾波

[編輯 | 編輯原始碼]

MATLAB 使用兩種方法之一,相關性卷積,來濾除各種影像。這兩種操作除了卷積在濾波前將濾波器矩陣旋轉 180 度外,其餘部分相同,而相關性則保持不變。

二維卷積動畫
Clipboard

待辦事項
展示計算原理


直接卷積使用 conv2 方法和 imfilter 函式來實現。對於影像,由於濾波器遠小於影像,因此 imfilter 中實現的直接方法(使用 MEX 函式來提高速度)通常更快。

FFT 方法

[編輯 | 編輯原始碼]

可以證明,空間域中的卷積(如前所述)等效於傅立葉域中的乘法

其中 F 是傅立葉變換運算元。如果 A 和 B 大小几乎相同,則對 A 和 B 都執行傅立葉變換,相乘,然後反轉結果通常比直接執行計算更快。

為了使用此方法,需要用零填充 A 和 B 中較小的一個,以便 A 和 B 的大小相同。實際上,如果 A 和 B 都被填充以使其長度為 2 的冪,則此方法最快,因為 FFT 演算法針對這些大小進行了最佳化。在形成填充後的矩陣 A' 和 B' 後,計算兩個矩陣的 FFT(使用 fft2 函式),將它們相乘,然後反轉它們以找到完整的卷積(填充了許多零)。以下是一些實現此方法的示例程式碼,並返回等效於 MATLAB 中 'same' 引數的卷積


Clipboard

待辦事項
放入執行此操作的程式碼


使用影像分析工具箱

[編輯 | 編輯原始碼]

濾波器可以用於以不同的方式模糊影像,或使其更清晰。函式 fspecial 包含許多您可以用於這些目的的預定義濾波器。此函式的語法為

>> filter = fspecial(typeoffilter, parameters);

如果沒有提供引數,則濾波器的預設大小取決於濾波器的型別;有關詳細資訊,請參見 MATLAB 文件頁面。其他型別的濾波器也具有其他選項,例如高斯濾波器中的標準差。


Clipboard

待辦事項
建立一些示例影像來顯示每個濾波器的效果


您也可以透過簡單地將濾波器定義為矩陣來使用自己的濾波器。


Clipboard

待辦事項
簡單介紹一下濾波器設計


為了濾除影像,MATLAB 用周圍畫素的加權平均值替換影像的每個畫素。權重由濾波器的值決定,周圍畫素的數量由使用的濾波器的大小決定。MATLAB 包含一個用於執行濾波的函式:imfilter

>> newimage = imfilter(myimage, filter, parameters);

有幾個可能的引數決定了 MATLAB 如何處理影像邊緣的畫素(因為邊緣的加權平均值需要一些東西來權衡影像邊界之外的東西)。這些包括用常量填充它(在 parameters 位置為 imfilter 提供一個數字),跨邊界反射影像(parameters = 'symmetric'),假設影像具有周期性(parameters = 'circular'),或複製邊界畫素值(parameters = 'replicate')。要使用哪種最佳方法取決於應用程式,因此最好對其進行試驗。

您可以傳遞的另一個引數是相關性與卷積的選擇。相關性是預設使用的;將 'conv' 傳遞給 imfilter 以使用卷積。請注意,相關性將旋轉您的濾波器,如果它打算對影像產生特定方向的影響,請做好準備。

華夏公益教科書