腐蚀与膨胀
簡單來講,形態學操作就是基于形狀的一系列圖像處理操作。通過將?結構元素?作用于輸入圖像來產生輸出圖像。
最基本的形態學操作有二:腐蝕與膨脹(Erosion 與 Dilation)。 他們的運用廣泛:
1、消除噪聲
2、分割(isolate)獨立的圖像元素,以及連接(join)相鄰的元素。
3、尋找圖像中的明顯的極大值區域或極小值區域。
注意:腐蝕和膨脹是對白色區域(高亮部分)而言,不是黑色部分;膨脹是圖像中高亮部分進行膨脹,效果圖擁有比原圖更大的高亮區域;腐蝕是圖像中高亮部分進行腐蝕,效果圖擁有比原圖更小的高亮區域。
膨脹
求局部最大值,并把最大值賦給參考點指定的像素,這樣會使得圖像中高亮區域逐漸增長。
進行?腐蝕?操作的函數是?dilate?。 它接受了三個參數:
src: 原圖像
?dilate?_dst: 輸出圖像
element: 腐蝕操作的內核。 如果不指定,默認為一個簡單的??矩陣。否則,我們就要明確指定它的形狀,可以使用函數?getStructuringElement:
我們可以為我們的內核選擇三種形狀之一:
- 矩形: MORPH_RECT
- 交叉形: MORPH_CROSS
- 橢圓形: MORPH_ELLIPSE
然后,我們還需要指定內核大小,以及?錨點?位置。不指定錨點位置,則默認錨點在內核中心位置。
腐蝕
求局部最小值,并把最小值賦給參考點指定的像素,這樣會使得圖像中高亮區域逐漸減少。
進行?腐蝕?操作的函數是?erode?。 它接受了三個參數:
src: 原圖像
erosion_dst: 輸出圖像
element: 腐蝕操作的內核。 如果不指定,默認為一個簡單的??矩陣。否則,我們就要明確指定它的形狀,可以使用函數?getStructuringElement:
我們可以為我們的內核選擇三種形狀之一:
- 矩形: MORPH_RECT
- 交叉形: MORPH_CROSS
- 橢圓形: MORPH_ELLIPSE
然后,我們還需要指定內核大小,以及?錨點?位置。不指定錨點位置,則默認錨點在內核中心位置。
程序
#include<opencv2/opencv.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<vector>
#include<time.h>
#include<opencv2/core/core.hpp>
#include <iostream>
using namespace cv;
using namespace std;
//--------------------------------------【main( )函數】-----------------------------------------
// 描述:控制臺應用程序的入口函數,我們的程序從這里開始執行
//-------------------------------------------------------------------------------------------------Mat src = imread("D:\\VC\\c++\\opencv源碼\\opencv源碼\\12.bmp");
Mat dst1 ,dst2;
int p = 3;//膨脹參數值
int f = 4;//腐蝕參數值//膨脹回調函數
void on_p(int, void*)
{Mat element = getStructuringElement(MORPH_ELLIPSE, Size(p * 2 + 1, p * 2 + 1));dilate(src, dst1, element);imshow("膨脹圖", dst1);
}//腐蝕回調函數
void on_f(int, void*)
{Mat element1 = getStructuringElement(MORPH_ELLIPSE, Size(f * 2 + 1, f * 2 + 1));erode(src, dst2,element1);imshow("腐蝕圖", dst2);
}
int main()
{double time0 = static_cast<double>(getTickCount());//記錄起始時間namedWindow("原圖", WINDOW_FREERATIO);namedWindow("膨脹圖");namedWindow("腐蝕圖");imshow("原圖", src);//膨脹createTrackbar("內核值", "膨脹圖", &p, 20, on_p);on_p(p, 0);//腐蝕createTrackbar("內核值", "腐蝕圖", &f, 20, on_f);on_f(f, 0);time0 = ((double)getTickCount() - time0) / getTickFrequency();cout << "此方法運行時間:" << time0 << "秒" << endl;//輸出運行時間waitKey(0);return 0;
}
?
?
?
總結
- 上一篇: 非线性滤波(opencv)
- 下一篇: 图像形态学(opencv),运行后通过在