OpenCV膨脹、腐蝕、開閉運算
阿新 • • 發佈:2018-12-19
腐蝕和膨脹是最基本的形態學運算。
腐蝕和膨脹是針對白色部分(高亮部分)而言的。
膨脹就是對影象高亮部分進行“領域擴張”,效果圖擁有比原圖更大的高亮區域;腐蝕是原圖中的高亮區域被蠶食,效果圖擁有比原圖更小的高亮區域。
膨脹
膨脹就是求區域性最大值的操作,從影象直觀看來,就是將影象光亮部分放大,黑暗部分縮小。
#include<opencv2\opencv.hpp> #include<opencv2\highgui\highgui.hpp> using namespace std; using namespace cv; //膨脹 int main() { Mat img = imread("lol1.jpg"); namedWindow("原始圖", WINDOW_NORMAL); imshow("原始圖", img); Mat out; //獲取自定義核 Mat element = getStructuringElement(MORPH_RECT, Size(15, 15)); //第一個引數MORPH_RECT表示矩形的卷積核,當然還可以選擇橢圓形的、交叉型的 //膨脹操作 dilate(img, out, element); namedWindow("膨脹操作", WINDOW_NORMAL); imshow("膨脹操作", out); waitKey(0); }
可以看到,影象原來光亮的部分被放大了,黑暗的部分被縮小了。
腐蝕
#include<opencv2\opencv.hpp> #include<opencv2\highgui\highgui.hpp> using namespace std; using namespace cv; //腐蝕 int main() { Mat img = imread("lol1.jpg"); namedWindow("原始圖", WINDOW_NORMAL); imshow("原始圖", img); Mat out; //獲取自定義核 Mat element = getStructuringElement(MORPH_RECT, Size(15, 15)); //第一個引數MORPH_RECT表示矩形的卷積核,當然還可以選擇橢圓形的、交叉型的 //腐蝕操作 erode(img, out, element); namedWindow("腐蝕操作", WINDOW_NORMAL); imshow("腐蝕操作", out); waitKey(0); }
可以看到,影象原來黑暗的部分被放大了,明亮的部分被縮小了。
開運算:先腐蝕再膨脹,用來消除小物體
閉運算:先膨脹再腐蝕,用於排除小型黑洞
形態學梯度:就是膨脹圖與俯檢視之差,用於保留物體的邊緣輪廓。
頂帽:原影象與開運算圖之差,用於分離比鄰近點亮一些的斑塊。
黑帽:閉運算與原影象之差,用於分離比鄰近點暗一些的斑塊。
opencv裡有一個很好的函式getStructuringElement,我們只要往這個函式傳相應的處理引數,就可以進行相應的操作了,使用起來非常方便。
下面列舉一下相應的操作巨集定義。
#include<opencv2\opencv.hpp> #include<opencv2\highgui\highgui.hpp> using namespace std; using namespace cv; //高階形態學處理 int main() { Mat img = imread("lol1.jpg"); namedWindow("原始圖", WINDOW_NORMAL); imshow("原始圖", img); Mat out; //獲取自定義核 Mat element = getStructuringElement(MORPH_RECT, Size(15, 15)); //第一個引數MORPH_RECT表示矩形的卷積核,當然還可以選擇橢圓形的、交叉型的 //高階形態學處理,呼叫這個函式就可以了,具體要選擇哪種操作,就修改第三個引數就可以了。這裡演示的是形態學梯度處理 morphologyEx(img, out, MORPH_GRADIENT, element); namedWindow("形態學處理操作", WINDOW_NORMAL); imshow("形態學處理操作", out); waitKey(0); }
形態學梯度處理
這個是頂帽運算的效果
參考: