1. 腐蝕和膨脹
腐蝕和膨脹是最基本的形態學操作,腐蝕和膨脹都是針對白色部分(高亮部分)而言的。
膨脹就是使圖像中高亮部分擴張,效果圖擁有比原圖更大的高亮區域;腐蝕是原圖中的高亮區域被蠶食,效果圖擁有比原圖更小的高亮區域。膨脹是求局部最大值的操作,腐蝕是求局部最小值的操作。
膨脹與腐蝕能實現多種多樣的功能,主要如下:
- 消除噪聲
- 分割(isolate)出獨立的圖像元素,在圖像中連接(join)相鄰的元素。
- 尋找圖像中的明顯的極大值區域或極小值區域
- 求出圖像的梯度
1 #include"stdafx.h" 2 #include<opencv2\opencv.hpp> 3 #include<opencv2\highgui\highgui.hpp> 4 #include<iostream> 5 #include<Windows.h> 6 #include<time.h> 7 8 using namespace std; 9 using namespace cv; 10 11 // 常見數據結構使用方法 12 int main() 13 { 14 Mat img = imread("1.jpg"); 15 namedWindow("原始圖",WINDOW_NORMAL); 16 imshow("原始圖",img); 17 18 // 膨脹操作 19 20 Mat out1; 21 // 獲取自定義核 22 Mat element1 = getStructuringElement(MORPH_RECT, Size(5,5)); // 第一個參數表示矩形的卷積核,還可以選擇圓形的和交叉型的 23 dilate(img, out1, element1); 24 namedWindow("膨脹操作",WINDOW_NORMAL); 25 imshow("膨脹操作",out1); 26 27 // 腐蝕操作 28 29 Mat out2; 30 // 獲取自定義核 31 Mat element2 = getStructuringElement(MORPH_RECT,Size(5,5)); // 第一個參數表示矩形的卷積核,還可以選擇圓形的和交叉型的 32 erode(img,out2,element2); 33 namedWindow("腐蝕操作",WINDOW_NORMAL); 34 imshow("腐蝕操作",out2); 35 36 waitKey(0); 37 return 0; 38 39 }
2. 進階操作
(1).腐蝕
結構A被結構B腐蝕的定義為,
可以理解為,移動結構B,如果結構B與結構A的交集完全屬於結構A的區域內,則保存該位置點,所有滿足條件的點構成結構A被結構B腐蝕的結果。 (最上面那個綠色方框應該沒有)

(2).膨脹
結構A被結構B膨脹的定義為,
A⨁B={z|(B^)z⋂A≠∅}A⨁B={z|(B^)z⋂A≠∅}
可以理解為,將結構B在結構A上進行卷積操作,如果移動結構B的過程中,與結構A存在重疊區域,則記錄該位置,所有移動結構B與結構A存在交集的位置的集合為結構A在結構B作用下的膨脹結果。
圖示中紅色框內的區域表示結構A在結構B的作用下膨脹的結果。

這里有另外一個例子:
(3).開操作
先腐蝕后膨脹的操作稱之為開操作。它具有消除細小物體,在纖細處分離物體和平滑較大物體邊界的作用。 采用上圖的結構B對原件進行開操作,
(4).閉操作
先膨脹后腐蝕的操作稱之為閉操作。它具有填充物體內細小空洞,連接鄰近物體和平滑邊界的作用。 采用上圖的結構對原件進行閉操作,

3. 高級操作
(1). 頂帽運算
為原圖像與上文剛剛介紹的“開運算“的結果圖之差,數學表達式如下:

因為開運算帶來的結果是放大了裂縫或者局部低亮度的區域,因此,從原圖中減去開運算后的圖,得到的效果圖突出了比原圖輪廓周圍的區域更明亮的區域,且這一操作和選擇的核的大小相關。
頂帽運算往往用來分離比鄰近點亮一些的斑塊。當一幅圖像具有大幅的背景的時候,而微小物品比較有規律的情況下,可以使用頂帽運算進行背景提取。
(2). 黑帽運算
為”閉運算“的結果圖與原圖像之差。數學表達式為:

黑帽運算后的效果圖突出了比原圖輪廓周圍的區域更暗的區域,且這一操作和選擇的核的大小相關。
黑帽運算用來分離比鄰近點暗一些的斑塊。
(3). 一些形態學操作的宏定義

1 #include"stdafx.h" 2 #include<opencv2\opencv.hpp> 3 #include<opencv2\highgui\highgui.hpp> 4 #include<iostream> 5 #include<Windows.h> 6 #include<time.h> 7 8 using namespace std; 9 using namespace cv; 10 11 12 int main() 13 { 14 Mat img = imread("1.jpg"); 15 namedWindow("原始圖",WINDOW_NORMAL); 16 imshow("原始圖",img); 17 18 // 高級形態學操作 19 20 Mat out; 21 // 獲取自定義核 22 Mat element = getStructuringElement(MORPH_RECT, Size(5,5)); // 第一個參數表示矩形的卷積核,還可以選擇圓形的和交叉型的 23 morphologyEx(img, out, MORPH_GRADIENT, element); // 各種形態學操作都可用此函數,具體使用什么操作取決於第三個參數,這里是形態學梯度操作。 24 namedWindow("梯度操作",WINDOW_NORMAL); 25 imshow("梯度操作",out); 26 27 waitKey(0); 28 return 0; 29 30 }
