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


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腐蝕的定義為, 

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

  可以理解為,移動結構B,如果結構B與結構A的交集完全屬於結構A的區域內,則保存該位置點,所有滿足條件的點構成結構A被結構B腐蝕的結果。 (最上面那個綠色方框應該沒有)

                                               

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

   AB={z|(B^)zA}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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM