1. 程式人生 > >OpenCV基礎(七)---形態學基礎:腐蝕與膨脹

OpenCV基礎(七)---形態學基礎:腐蝕與膨脹

get 邊緣 參數聲明 The lba not 最大值 col order

形態學圖像處理

形態學是研究動植物形態(form)的科學。這裏我們使用同一術語表示數學形態學的內容。

數學形態學(Mathematical morphology) 是一門建立在格論和拓撲學基礎之上的圖像分析學科,

是數學形態學圖像處理的基本理論。其基本的運算包括:腐蝕和膨脹、開運算和閉運算、

骨架抽取、極限腐蝕、擊中擊不中變換、形態學梯度、Top-hat變換、顆粒分析、流域變換等

預備知識

對一副二值圖像進行形態學處理,首先要定義結構元(SE),結構元的形狀通常為矩形和圓形。

如圖1,陰影部分為結構元B,白色部分是添加的最小可能的背景元素以構成矩形。

對圖2,圖像A進行一種形態學處理得到圖3.

處理方法:結構元B在集合A上進行移動,若陰影部分完全重合,此時結構元的中心點,在新圖像上標記為陰影.

可以看到,在邊緣處,B不能完全包含在A中,最終邊界被腐蝕掉了.

PS:灰度圖像與此類似,定義方法不同

技術分享圖片 技術分享圖片 技術分享圖片

圖1 結構元 圖2 處理前 圖3 處理後

膨脹

集合A和集合B,A⊕B表示為B對A的膨脹,定義為,

技術分享圖片

這個公式,以B關於它原點的映像,並且以z對映像進行平移,B對A的膨脹是所有位移z的集合.

灰度形態學是二值形態學的擴展,研究對象是
灰度圖像。在灰度形態學中,膨脹與腐蝕運算相當
於求局部最大值和最小值操作。膨脹與腐蝕運算
是其他形態學操作的基礎,可利用灰度形態學膨脹
與腐蝕組成的形態學變換對灰度圖進行濾波、邊緣
檢測、分割、紋理分析等。

灰度圖的膨脹:

膨脹的目的是求局部最大值,即計算結構元素
在圖像中所覆蓋區域的像素點最大值,並把這個最大值賦給當前結構元素中心指定的像素.

腐蝕

集合A和集合B,A一B表示為B對A的腐蝕,定義為,

技術分享圖片

該式指出B對A的腐蝕是一個用z平移的B包含在A中所有的點z的集合.

灰度圖的腐蝕:

腐蝕是膨脹的對偶操作,計算圖像中被結構元素覆蓋區域的最小像素值,

並把當前結構元素中心所在的像素置為最小值

函數介紹

Mat getStructuringElement(int shape, Size ksize, Point anchor = Point(-1,-1));

函數功能:返回指定形狀和大小的結構元

函數聲明:

  • shape 結構元的形狀,可以為cv::MorphShapes中的一種
  • ksize 結構元的尺寸
  • anchor 錨點默認為結構元中心,一般取默認

void dilate( InputArray src, OutputArray dst, InputArray kernel,
                          Point anchor = Point(-1,-1), int iterations = 1,
                          int borderType = BORDER_CONSTANT,
                          const Scalar& borderValue = morphologyDefaultBorderValue() );

函數功能:膨脹圖像

參數聲明略    

 void erode( InputArray src, OutputArray dst, InputArray kernel,
                         Point anchor = Point(-1,-1), int iterations = 1,
                         int borderType = BORDER_CONSTANT,
                         const Scalar& borderValue = morphologyDefaultBorderValue() );

函數功能:腐蝕圖像

參數聲明略

代碼

 1 #include <opencv2/opencv.hpp> 
 2 #include <iostream> 
 3 using namespace cv;
 4 using namespace std;
 5 Mat src, dst;
 6 char output_title[] = "dilate image";
 7 int element_size = 3;
 8 int max_size = 21;
 9 void CallBack_Demo(int, void*);
10 int main() {
11 
12     src = imread("D:/cat.png");
13     if (!src.data) {
14         cout << "could not load image..." << endl;
15         return -1;
16     }
17     imshow("input image", src);
18 
19     namedWindow(output_title, CV_WINDOW_AUTOSIZE);
20     createTrackbar("Element Size :", output_title, &element_size, max_size, CallBack_Demo);
21     CallBack_Demo(0, 0);
22 
23     waitKey(0);
24     return 0;
25 }
26 
27 void CallBack_Demo(int, void*) {
28     int s = element_size * 2 + 1;
29     Mat structureElement = getStructuringElement(MORPH_RECT, Size(s, s), Point(-1, -1));
30     dilate(src, dst, structureElement, Point(-1, -1), 1);
31     //erode(src, dst, structureElement, Point(-1, -1), 1);
32     imshow(output_title, dst);
33     return;
34 }

效果對比圖

技術分享圖片技術分享圖片 技術分享圖片

OpenCV基礎(七)---形態學基礎:腐蝕與膨脹