OpenCV 图象腐蚀形态学操作 全家桶
图象腐蚀与形态学操作 opencv
1. 通过调用库函数实现图像的腐蚀、膨胀;
2. 通过设置结构元素、元素大小、形态学操作类型实现对图象的形态学操作。
源码(VS2017+OpenCV 4.0)
1 #include <iostream> 2 #include <opencv2/opencv.hpp> 3 #include <opencv2/core.hpp> 4 #include <opencv2/highgui.hpp> 5 #include <opencv2/imgproc/imgproc.hpp> 6 #include <opencv2/imgproc/types_c.h> 7 using namespace std; 8 using namespace cv; 9 10 //全局变量 11 Mat src, res; 12 int slider = 0;//腐蚀膨胀滑杆 13 const int slider_max = 30; 14 int operation = 0;//形态学操作类型 15 const int operation_max = 4; 16 int kenl = 0;//内核类型 17 const int kenl_max = 2; 18 int kenl_size = 1;//内核大小 19 const int kenl_size_max = 4; 20 21 //回调函数 22 void on_trackbar(int pos, void*); 23 //腐蚀 24 void getErodeAndDilate(int level, int pattern); 25 26 //腐蚀 27 void getErodeAndDilate(int level, int pattern) 28 { 29 //进行腐蚀/膨胀 30 if(pattern == 0) 31 erode(src, res, Mat(), Point(-1, -1), level); 32 else if(pattern == 1) 33 dilate(src, res, Mat(), Point(-1, -1), level); 34 35 imshow("处理结果1", res); 36 } 37 38 //回调函数:腐蚀 39 void on_trackbar1(int pos, void*) 40 { 41 getErodeAndDilate(pos, 0); 42 } 43 44 //回调函数:膨胀 45 void on_trackbar2(int pos, void*) 46 { 47 getErodeAndDilate(pos, 1); 48 } 49 50 //回调函数:形态学操作类型 51 void on_trackbar3(int pos, void*) 52 { 53 int op = pos + 2; 54 //选择内核形状 55 Mat elemment = getStructuringElement(kenl, Size(2 * kenl_size + 1, 2 * kenl_size + 1)); 56 57 morphologyEx(src, res, op, elemment); 58 imshow("处理结果2", res); 59 } 60 61 int main() 62 { 63 string file = "D:\\trashBox\\testIMG\\monkey.jpg"; 64 src = imread(file); 65 if (!src.data) 66 { 67 cout << "图片读取失败." << endl; 68 return 0; 69 } 70 namedWindow("处理结果1"); 71 //创建选择腐蚀次数的 trackbar 72 createTrackbar("腐蚀级数", "处理结果1", &slider, slider_max, on_trackbar1); 73 //创建选择膨胀次数的 trackbar 74 createTrackbar("膨胀级数", "处理结果1", &slider, slider_max, on_trackbar2); 75 76 namedWindow("处理结果2"); 77 //创建选择具体操作的 trackbar 78 createTrackbar("形态学操作\n开运算-0\n闭运算-1\n梯度-2\nTopHat-3\nBlackHat-4", "处理结果2", &operation, operation_max, on_trackbar3); 79 //创建选择内核形状的 trackbar 80 createTrackbar("结构元素:\n 0: Rect - 1: Cross - 2: Ellipse", "处理结果2", &kenl, kenl_max, on_trackbar3); 81 //创建选择内核大小的 trackbar 82 createTrackbar("内核大小:\n 2n +1", "处理结果2", &kenl_size, kenl_size_max, on_trackbar3); 83 84 waitKey(0); 85 return 0; 86 }
效果图
1. 图像腐蚀、膨胀
2. 形态学操作
其他组合操作,自己去探索吧,挺有趣的!
更多opencv中文资料,参考这里哟!