1. 程式人生 > >opencv 形態學處理——膨脹

opencv 形態學處理——膨脹

膨脹與腐蝕能實現各種功能:

(1)消除噪聲;

(2)分割出獨立的影象元素,在影象中連線相鄰的元素;

(3)尋找影象中的極大值區域和極小值區域;

(4)求出影象梯度;

膨脹就是求區域性最大值的操作。就是將影象與核進行卷積。

腐蝕和膨脹是對白色部分(高亮部分)而言的,不是黑色部分。膨脹是對影象中高亮部分進行膨脹,效果圖擁有比原圖更大的高亮區域。

腐蝕是對原圖高亮部分的腐蝕,效果圖擁有比原圖更小的高亮區域。

大部分情況中,核是一箇中間帶有參考點的實心正方形或者圓盤。

相關API函式:

膨脹:dilate函式

函式原型:

void dilate(InputArray src,

                  OutputArray dst,

                  InputArray kernel,

                  Point anchor=Point(-1,-1),

                 int iterations=1,

                 int borderType=BORDER_CONSTANT,

                  const Scalar& borderValue=morphologyDefaultBorderValue()

                  );

引數解析:

第一個引數:InputArray型別的src,源影象,Mat類的物件。

第二個引數:OutputArray型別的dst,目標影象,與源影象有相同的尺寸和型別。

第三個引數:InputArray型別的kernel,膨脹操作的核。當為NULL是,表示使用參考點位於中心3X3的核。

                        一般與getStructuringElement函式配合使用。函式介紹:http://blog.csdn.net/kksc1099054857/article/details/76569718

第四個引數:Point型別的anchor,錨的位置,有預設值(-1,-1),表示錨的中心。

第五個引數:int型別的iterations,迭代使用dilate()函式的次數,預設值為。

第六個引數:int型別的borderType,用於推斷影象外部畫素的某種邊界模式。

第七個引數:const Scalar&型別的borderValue,當邊界為常數時的邊界值,用預設值morphologyDefaultBorderValue(),一般不去管它。

使用erode函式,使用erode函式,一般只需要填前面三個引數,後面的引數都有預設值,而且會與getStructureElement使用。

下面給出一個例子:

#include "stdafx.h"
#include "opencv2/opencv.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
using namespace std;
using namespace cv;
int main()
{
Mat img = imread("E:/VS2017Projects/dilate/dilate/3.jpg");
imshow("原圖",img);
Mat element = getStructuringElement(MORPH_RECT, Size(10, 10));
Mat dst;
dilate(img, dst, element);
imshow("膨脹操作", dst);
waitKey(0);
return 0;
}

效果圖: