MATLAB 程式設計/高階主題/工具箱和擴充套件/影像處理工具箱
核心 MATLAB 包附帶了一些基本的函式(將在後面介紹),這些函式可用於載入、儲存影像以及對影像執行自定義函式。但是,通常需要對影像執行更復雜的操作。影像處理工具箱允許進行以下操作:
以及其他許多操作。
要將影像載入到 MATLAB 中,您可以使用“匯入資料”GUI(與文字檔案或類似檔案相同),也可以使用“imread”函式。要使用“imread”,您必須將影像所在的目錄新增到目錄列表中。然後使用以下語法:
>> myimage = imread('myimage.extension');
建議使用分號,尤其是這裡,因為影像包含大量資料。
如果影像為彩色影像,MATLAB 預設情況下會將影像資料轉換為 RGB 色彩空間(對於大多數與之相容的資料格式)。單獨的通道由影像的第三維表示。以下程式碼分離了影像的通道並指示每個通道的顏色。
>> redchannel = myimage(:,:,1); >> greenchannel = myimage(:,:,2); >> bluechannel = myimage(:,:,3);
MATLAB 中的另一個預設函式可用於將影像儲存到新檔案。函式“imwrite”接受兩種不同的語法:
>> imwrite(myimage, 'nameoffile.extension')
或者
>> imwrite(myimage, 'nameoffile', 'extension')
使用第二種語法時,不要在副檔名之前使用句點。有關匯入和匯出的支援檔案型別,請參見 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。
請注意,從 RGB 等裝置特定的色彩空間轉換為 LAB 或 XYZ 等非裝置特定的空間時,不可避免地會產生一些誤差。原因之一是 MATLAB 提供的 RGB 值通常使用來自相機的伽馬進行編碼(並在顯示在螢幕上之前由顯示器提供另一個伽馬),這使得 RGB 和 LAB 值之間的關係取決於相機的內部結構,並且是非線性的(且難以準確確定)。作為近似值,人們通常可以使用冪律函式來獲得未修改的 RGB 值,理論上這些值應該與每個畫素的 LAB 值線性相關。
請注意,這些方程式假設 R、G 和 B 的範圍在 0 到 255 之間,計算需要將 R、G 和 B 從預設的 uint8 類轉換為 double 類。
MATLAB 使用兩種方法之一,相關性或卷積,來濾除各種影像。這兩種操作除了卷積在濾波前將濾波器矩陣旋轉 180 度外,其餘部分相同,而相關性則保持不變。

直接卷積使用 conv2 方法和 imfilter 函式來實現。對於影像,由於濾波器遠小於影像,因此 imfilter 中實現的直接方法(使用 MEX 函式來提高速度)通常更快。
可以證明,空間域中的卷積(如前所述)等效於傅立葉域中的乘法
其中 F 是傅立葉變換運算元。如果 A 和 B 大小几乎相同,則對 A 和 B 都執行傅立葉變換,相乘,然後反轉結果通常比直接執行計算更快。
為了使用此方法,需要用零填充 A 和 B 中較小的一個,以便 A 和 B 的大小相同。實際上,如果 A 和 B 都被填充以使其長度為 2 的冪,則此方法最快,因為 FFT 演算法針對這些大小進行了最佳化。在形成填充後的矩陣 A' 和 B' 後,計算兩個矩陣的 FFT(使用 fft2 函式),將它們相乘,然後反轉它們以找到完整的卷積(填充了許多零)。以下是一些實現此方法的示例程式碼,並返回等效於 MATLAB 中 'same' 引數的卷積
濾波器可以用於以不同的方式模糊影像,或使其更清晰。函式 fspecial 包含許多您可以用於這些目的的預定義濾波器。此函式的語法為
>> filter = fspecial(typeoffilter, parameters);
如果沒有提供引數,則濾波器的預設大小取決於濾波器的型別;有關詳細資訊,請參見 MATLAB 文件頁面。其他型別的濾波器也具有其他選項,例如高斯濾波器中的標準差。
您也可以透過簡單地將濾波器定義為矩陣來使用自己的濾波器。
為了濾除影像,MATLAB 用周圍畫素的加權平均值替換影像的每個畫素。權重由濾波器的值決定,周圍畫素的數量由使用的濾波器的大小決定。MATLAB 包含一個用於執行濾波的函式:imfilter
>> newimage = imfilter(myimage, filter, parameters);
有幾個可能的引數決定了 MATLAB 如何處理影像邊緣的畫素(因為邊緣的加權平均值需要一些東西來權衡影像邊界之外的東西)。這些包括用常量填充它(在 parameters 位置為 imfilter 提供一個數字),跨邊界反射影像(parameters = 'symmetric'),假設影像具有周期性(parameters = 'circular'),或複製邊界畫素值(parameters = 'replicate')。要使用哪種最佳方法取決於應用程式,因此最好對其進行試驗。
您可以傳遞的另一個引數是相關性與卷積的選擇。相關性是預設使用的;將 'conv' 傳遞給 imfilter 以使用卷積。請注意,相關性將旋轉您的濾波器,如果它打算對影像產生特定方向的影響,請做好準備。
