OpenCV基礎(七)---形態學基礎:腐蝕與膨脹
形態學圖像處理
形態學是研究動植物形態(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基礎(七)---形態學基礎:腐蝕與膨脹