opencv再學習之路(三)---形態學操做

1. 腐蝕和膨脹ios

  腐蝕和膨脹是最基本的形態學操做,腐蝕和膨脹都是針對白色部分(高亮部分)而言的。數據結構

膨脹就是使圖像中高亮部分擴張,效果圖擁有比原圖更大的高亮區域;腐蝕是原圖中的高亮區域被蠶食,效果圖擁有比原圖更小的高亮區域。膨脹是求局部最大值的操做,腐蝕是求局部最小值的操做。函數

膨脹與腐蝕能實現多種多樣的功能,主要以下:ui

  • 消除噪聲
  • 分割(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. 進階操做spa

(1).腐蝕 
  結構A被結構B腐蝕的定義爲, .net

    AB={z|(B)zA}A⨀B={z|(B)z⊆A}

  能夠理解爲,移動結構B,若是結構B與結構A的交集徹底屬於結構A的區域內,則保存該位置點,全部知足條件的點構成結構A被結構B腐蝕的結果。 (最上面那個綠色方框應該沒有)3d

                                               

(2).膨脹 
  結構A被結構B膨脹的定義爲, code

   AB={z|(B^)zA}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 }
相關文章
相關標籤/搜索