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("形态学操作
开运算-0
闭运算-1
梯度-2
TopHat-3
BlackHat-4", "处理结果2", &operation, operation_max, on_trackbar3);
79     //创建选择内核形状的 trackbar
80     createTrackbar("结构元素:
 0: Rect - 1: Cross - 2: Ellipse", "处理结果2", &kenl, kenl_max, on_trackbar3);
81     //创建选择内核大小的 trackbar
82     createTrackbar("内核大小:
 2n +1", "处理结果2", &kenl_size, kenl_size_max, on_trackbar3);
83 
84     waitKey(0);
85     return 0;
86 }

效果图

1. 图像腐蚀、膨胀

2. 形态学操作

其他组合操作,自己去探索吧,挺有趣的!


更多opencv中文资料,参考这里哟!

原文地址:https://www.cnblogs.com/yocichen/p/10870451.html