1. 腐蝕和膨脹ios
腐蝕和膨脹是最基本的形態學操做,腐蝕和膨脹都是針對白色部分(高亮部分)而言的。數據結構
膨脹就是使圖像中高亮部分擴張,效果圖擁有比原圖更大的高亮區域;腐蝕是原圖中的高亮區域被蠶食,效果圖擁有比原圖更小的高亮區域。膨脹是求局部最大值的操做,腐蝕是求局部最小值的操做。函數
膨脹與腐蝕能實現多種多樣的功能,主要以下:ui
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. 進階操做spa
(1).腐蝕
結構A被結構B腐蝕的定義爲, .net
能夠理解爲,移動結構B,若是結構B與結構A的交集徹底屬於結構A的區域內,則保存該位置點,全部知足條件的點構成結構A被結構B腐蝕的結果。 (最上面那個綠色方框應該沒有)3d
(2).膨脹
結構A被結構B膨脹的定義爲, code
A⨁B={z|(B^)z⋂A≠∅}A⨁B={z|(B^)z⋂A≠∅}blog
能夠理解爲,將結構B在結構A上進行卷積操做,若是移動結構B的過程當中,與結構A存在重疊區域,則記錄該位置,全部移動結構B與結構A存在交集的位置的集合爲結構A在結構B做用下的膨脹結果。
圖示中紅色框內的區域表示結構A在結構B的做用下膨脹的結果。ci
這裏有另一個例子:
(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 }