OpenCV 图像处理 (线性滤波,非线性滤波 - 方框滤波均值滤波高斯滤波中值滤波,双边滤波)
Posted ybqjymy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenCV 图像处理 (线性滤波,非线性滤波 - 方框滤波均值滤波高斯滤波中值滤波,双边滤波)相关的知识,希望对你有一定的参考价值。
1 线性滤波:方框滤波、均值滤波、高斯滤波
1.1方框滤波(box Filter)
1.2均值滤波(blur函数)
缺陷:
1.3高斯滤波(GaussianBlur函数)
1.4线性滤波核心API函数
boxFilter
1 #include "opencv2/core/core.hpp"
2 #include "opencv2/highgui/highgui.hpp"
3 #include "opencv2/imgproc/imgproc.hpp"
4 using namespace cv;
5
6 //-----------------------------------【main( )函数】--------------------------------------------
7 // 描述:控制台应用程序的入口函数,我们的程序从这里开始
8 //-----------------------------------------------------------------------------------------------
9 int main()
10 {
11 // 载入原图
12 Mat image = imread("1.jpg");
13
14 //创建窗口
15 namedWindow("方框滤波【原图】");
16 namedWindow("方框滤波【效果图】");
17
18 //显示原图
19 imshow("方框滤波【原图】", image);
20
21 //进行方框滤波操作
22 Mat out;
23 boxFilter(image, out, -1, Size(5, 5));
24
25 //显示效果图
26 imshow("方框滤波【效果图】", out);
27
28 waitKey(0);
29 }
blur
1 #include "opencv2/highgui/highgui.hpp"
2 #include "opencv2/imgproc/imgproc.hpp"
3 using namespace cv;
4
5 //-----------------------------------【main( )函数】--------------------------------------------
6 // 描述:控制台应用程序的入口函数,我们的程序从这里开始
7 //-----------------------------------------------------------------------------------------------
8 int main( )
9 {
10 //【1】载入原始图
11 Mat srcImage=imread("1.jpg");
12
13 //【2】显示原始图
14 imshow( "均值滤波【原图】", srcImage );
15
16 //【3】进行均值滤波操作
17 Mat dstImage;
18 blur( srcImage, dstImage, Size(7, 7));
19
20 //【4】显示效果图
21 imshow( "均值滤波【效果图】" ,dstImage );
22
23 waitKey( 0 );
24 }
GaussianBlur
1 #include "opencv2/core/core.hpp"
2 #include "opencv2/highgui/highgui.hpp"
3 #include "opencv2/imgproc/imgproc.hpp"
4 using namespace cv;
5
6 //-----------------------------------【main( )函数】--------------------------------------------
7 // 描述:控制台应用程序的入口函数,我们的程序从这里开始
8 //-----------------------------------------------------------------------------------------------
9 int main( )
10 {
11 // 载入原图
12 Mat image=imread("1.jpg");
13
14 //创建窗口
15 namedWindow( "高斯滤波【原图】" );
16 namedWindow( "高斯滤波【效果图】");
17
18 //显示原图
19 imshow( "高斯滤波【原图】", image );
20
21 //进行高斯滤波操作
22 Mat out;
23 GaussianBlur( image, out, Size( 5, 5 ), 0, 0 );
24
25 //显示效果图
26 imshow( "高斯滤波【效果图】" ,out );
27
28 waitKey( 0 );
29 }
综合实例
1 #include <opencv2/core/core.hpp>
2 #include <opencv2/highgui/highgui.hpp>
3 #include <opencv2/imgproc/imgproc.hpp>
4 #include <iostream>
5
6 using namespace std;
7 using namespace cv;
8
9
10 //-----------------------------------【全局变量声明部分】--------------------------------------
11 // 描述:全局变量声明
12 //-----------------------------------------------------------------------------------------------
13 Mat g_srcImage, g_dstImage1, g_dstImage2, g_dstImage3;//存储图片的Mat类型
14 int g_nBoxFilterValue = 3; //方框滤波参数值
15 int g_nMeanBlurValue = 3; //均值滤波参数值
16 int g_nGaussianBlurValue = 3; //高斯滤波参数值
17
18
19 //-----------------------------------【全局函数声明部分】--------------------------------------
20 // 描述:全局函数声明
21 //-----------------------------------------------------------------------------------------------
22 //四个轨迹条的回调函数
23 static void on_BoxFilter(int, void *); //均值滤波
24 static void on_MeanBlur(int, void *); //均值滤波
25 static void on_GaussianBlur(int, void *); //高斯滤波
26 void ShowHelpText();
27
28
29 //-----------------------------------【main( )函数】--------------------------------------------
30 // 描述:控制台应用程序的入口函数,我们的程序从这里开始
31 //-----------------------------------------------------------------------------------------------
32 int main()
33 {
34 //改变console字体颜色
35 system("color 5F");
36
37 //输出帮助文字
38 ShowHelpText();
39
40 // 载入原图
41 g_srcImage = imread("1.jpg", 1);
42 if (!g_srcImage.data) { printf("Oh,no,读取srcImage错误~!
"); return false; }
43
44 //克隆原图到三个Mat类型中
45 g_dstImage1 = g_srcImage.clone();
46 g_dstImage2 = g_srcImage.clone();
47 g_dstImage3 = g_srcImage.clone();
48
49 //显示原图
50 namedWindow("【<0>原图窗口】", 1);
51 imshow("【<0>原图窗口】", g_srcImage);
52
53
54 //=================【<1>方框滤波】==================
55 //创建窗口
56 namedWindow("【<1>方框滤波】", 1);
57 //创建轨迹条
58 createTrackbar("内核值:", "【<1>方框滤波】", &g_nBoxFilterValue, 40, on_BoxFilter);
59 on_MeanBlur(g_nBoxFilterValue, 0);
60 imshow("【<1>方框滤波】", g_dstImage1);
61 //================================================
62
63 //=================【<2>均值滤波】==================
64 //创建窗口
65 namedWindow("【<2>均值滤波】", 1);
66 //创建轨迹条
67 createTrackbar("内核值:", "【<2>均值滤波】", &g_nMeanBlurValue, 40, on_MeanBlur);
68 on_MeanBlur(g_nMeanBlurValue, 0);
69 //================================================
70
71 //=================【<3>高斯滤波】=====================
72 //创建窗口
73 namedWindow("【<3>高斯滤波】", 1);
74 //创建轨迹条
75 createTrackbar("内核值:", "【<3>高斯滤波】", &g_nGaussianBlurValue, 40, on_GaussianBlur);
76 on_GaussianBlur(g_nGaussianBlurValue, 0);
77 //================================================
78
79
80 //输出一些帮助信息
81 cout << endl << " 运行成功,请调整滚动条观察图像效果~
"
82 << " 按下“q”键时,程序退出。
";
83
84 //按下“q”键时,程序退出
85 while (char(waitKey(1)) != ‘q‘) {}
86
87 return 0;
88 }
89
90
91 //-----------------------------【on_BoxFilter( )函数】------------------------------------
92 // 描述:方框滤波操作的回调函数
93 //-----------------------------------------------------------------------------------------------
94 static void on_BoxFilter(int, void *)
95 {
96 //方框滤波操作
97 boxFilter(g_srcImage, g_dstImage1, -1, Size(g_nBoxFilterValue + 1, g_nBoxFilterValue + 1));
98 //显示窗口
99 imshow("【<1>方框滤波】", g_dstImage1);
100 }
101
102
103 //-----------------------------【on_MeanBlur( )函数】------------------------------------
104 // 描述:均值滤波操作的回调函数
105 //-----------------------------------------------------------------------------------------------
106 static void on_MeanBlur(int, void *)
107 {
108 //均值滤波操作
109 blur(g_srcImage, g_dstImage2, Size(g_nMeanBlurValue + 1, g_nMeanBlurValue + 1), Point(-1, -1));
110 //显示窗口
111 imshow("【<2>均值滤波】", g_dstImage2);
112 }
113
114
115 //-----------------------------【ContrastAndBright( )函数】------------------------------------
116 // 描述:高斯滤波操作的回调函数
117 //-----------------------------------------------------------------------------------------------
118 static void on_GaussianBlur(int, void *)
119 {
120 //高斯滤波操作
121 GaussianBlur(g_srcImage, g_dstImage3, Size(g_nGaussianBlurValue * 2 + 1, g_nGaussianBlurValue * 2 + 1), 0, 0);
122 //显示窗口
123 imshow("【<3>高斯滤波】", g_dstImage3);
124 }
125
126
127 //-----------------------------------【ShowHelpText( )函数】----------------------------------
128 // 描述:输出一些帮助信息
129 //----------------------------------------------------------------------------------------------
130 void ShowHelpText()
131 {
132 //输出欢迎信息和OpenCV版本
133 printf("
当前使用的OpenCV版本为:" CV_VERSION);
134 printf("
----------------------------------------------------------------------------
");
135 }
非线性滤波(中值滤波,双边滤波)
中值滤波(Median filter)(medianBlur函数)
1 #include "opencv2/core/core.hpp"
2 #include "opencv2/highgui/highgui.hpp"
3 #include "opencv2/imgproc/imgproc.hpp"
4
5 //-----------------------------------【命名空间声明部分】---------------------------------------
6 // 描述:包含程序所使用的命名空间
7 //-----------------------------------------------------------------------------------------------
8 using namespace cv;
9
10 //-----------------------------------【main( )函数】--------------------------------------------
11 // 描述:控制台应用程序的入口函数,我们的程序从这里开始
12 //-----------------------------------------------------------------------------------------------
13 int main()
14 {
15 // 载入原图
16 Mat image = imread("1.jpg");
17
18 //创建窗口
19 namedWindow("中值滤波【原图】");
20 namedWindow("中值滤波【效果图】");
21
22 //显示原图
23 imshow("中值滤波【原图】", image);
24
25 //进行中值滤波操作
26 Mat out;
27 medianBlur(image, out, 7);
28
29 //显示效果图
30 imshow("中值滤波【效果图】", out);
31
32 waitKey(0);
33 }
双边滤波(Bilateral filter)(bilateralFilter函数)
1 #include "opencv2/core/core.hpp"
2 #include "opencv2/highgui/highgui.hpp"
3 #include "opencv2/imgproc/imgproc.hpp"
4
5 //-----------------------------------【命名空间声明部分】---------------------------------------
6 // 描述:包含程序所使用的命名空间
7 //-----------------------------------------------------------------------------------------------
8 using namespace cv;
9
10 //-----------------------------------【main( )函数】--------------------------------------------
11 // 描述:控制台应用程序的入口函数,我们的程序从这里开始
12 //-----------------------------------------------------------------------------------------------
13 int main( )
14 {
15 // 载入原图
16 Mat image=imread("1.jpg");
17
18 //创建窗口
19 namedWindow( "双边滤波【原图】" );
20 namedWindow( "双边滤波【效果图】");
21
22 //显示原图
23 imshow( "双边滤波【原图】", image );
24
25 //进行双边滤波操作
26 Mat out;
27 bilateralFilter ( image, out, 25, 25*2, 25/2 );
28
29 //显示效果图
30 imshow( "双边滤波【效果图】" ,out );
31
32 waitKey( 0 );
33 }
以上是关于OpenCV 图像处理 (线性滤波,非线性滤波 - 方框滤波均值滤波高斯滤波中值滤波,双边滤波)的主要内容,如果未能解决你的问题,请参考以下文章