方框滤波
函数原型
复制代码
1
2
3void boxFilter(InputArray src, OutputArray dst, int ddepth, Size ksize, Point anchor = Point(-1,-1), boolnormalize = true, int borderType = BORDER_DEFAULT)
- 第一个参数,inputArray类型的src源图像,输入图像Mat类。图片深度CV_8U、CV_16U、CV_16S、CV_32F、CV_64F
- 第二个参数,OutputArray类型的dst目标图像,需与源图片尺寸类型一致
- 第三个参数, int类型的ddepth,输出图像深度,-1表示原图深度(即src.depth())
- 第四个参数,Size类型的ksize表示内核大小,Size(w,h)w表示像素宽度,h表示像素高度
- 第五个参数,Point类型的anchor表示锚点,默认值Point(-1,-1),如果该点坐标为负值,就表示取核的中心为锚点,所以默认Point(-1,-1)表示锚点还核的中心
- 第六个参数,bool类型的normalize,默认为true,一个标识符,表示内核是否被其区域归一化了
- 第七个参数,int类型的borderTypr,用于推断图像外部像素的某种边界模式,默认BORDER_DEFAULT,无需理会
均值滤波
函数原型
复制代码
1
2
3
4void blur(InputArray src, OutputArray dst, int ddepth, Size ksize, Point anchor = Point(-1,-1), int borderType = BORDER_DEFAULT)
-
第一个参数,inputArray类型的src源图像,输入图像Mat类。图片深度CV_8U、CV_16U、CV_16S、CV_32F、CV_64F
-
第二个参数,OutputArray类型的dst目标图像,需与源图片尺寸类型一致,可以用Mat::Clone
-
第三个参数, int类型的ddepth,输出图像深度,-1表示原图深度(即src.depth())
-
第四个参数,Size类型的ksize表示内核大小,Size(w,h)w表示像素宽度,h表示像素高度
-
第五个参数,Point类型的anchor表示锚点,默认值Point(-1,-1),如果该点坐标为负值,就表示取核的中心为锚点,所以默认Point(-1,-1)表示锚点还核的中心
-
第七个参数,int类型的borderTypr,用于推断图像外部像素的某种边界模式,默认BORDER_DEFAULT,无需理会
高斯滤波
函数原型
复制代码
1
2
3
4void GaussianBlur(InputArray src, OutputArray dst, Size ksize, double sigmaX,double sigmaY = 0, int borderType = BORDER_DEFAULT)
- 第一个参数,inputArray类型的src源图像,输入图像Mat类。图片深度CV_8U、CV_16U、CV_16S、CV_32F、CV_64F
- 第二个参数,OutputArray类型的dst目标图像,需与源图片尺寸类型一致
- 第三个参数,Size类型的ksize表示内核大小,ksize.width和ksize.height可以不同,但需要都为正数和奇数,或为0,由sigma计算得来
- 第四个参数,double类型的sigmaX表示高斯核函数在X方向的标准偏差
- 第五个参数,double类型的sigmaY表示高斯核函数在Y方向的标准偏差,若sigmaY=0,则设为sigmalX;如果sigmalX=sigmalY=0,则由ksize,width和ksize.height计算而来
- 第六个参数,int类型的borderTypr,用于推断图像外部像素的某种边界模式,默认BORDER_DEFAULT,无需理会
中值滤波(非线性滤波)
函数原型
复制代码
1
2
3void medianBlur(InputArray src, OutputArray dst, int ddepth, int ksize)
- 第一个参数,inputArray类型的src源图像,输入图像Mat类。图片深度CV_8U、CV_16U、CV_16S、CV_32F、CV_64F之一,对于较大孔径尺寸的图片时只为CV_8U
- 第二个参数,OutputArray类型的dst目标图像,需与源图片尺寸类型一致
- 第三个参数, int类型的ksize,孔径的线性尺寸,该参数必须为大于1的奇数。
双边滤波滤波(非线性滤波)
函数原型
复制代码
1
2
3
4void bilateralFilter(InputArray src, OutputArray dst, int d, double sigmalColor, double sigmalSpace, int borderType = BORDER_DEFAULT)
- 第一个参数,inputArray类型的src源图像,输入图像Mat类。图片深度CV_8U、CV_16U、CV_16S、CV_32F、CV_64F
- 第二个参数,OutputArray类型的dst目标图像,需与源图片尺寸类型一致
- 第三个参数, int类型的d,表示在滤波过程中每个像素领域的直径,如果这个值被设为非正数,那么OpenCV会从第五个参数sigmaSpace来计算出它
- 第四个参数,double类型的sigmaColor,颜色空间滤波器的sigma值。参数越大表明像素领域内有越宽广的颜色会被混合到一起,产生较大的半相等颜色区域
- 第五个参数,double类型的sigmaSpace,坐标空间中滤波器的sigma值,坐标空间的标注方差。它的数值越大,意味着越远的像素会相互影响,从而使更大的区域中足够相似的颜色获取相同的颜色。当d>0时,d指定了领域大小且与sigmaSpace无关,否则,d正比与sigmaSpace
- 第六个参数,bool类型的normalize,默认为true,一个标识符,表示内核是否被其区域归一化了
- 第七个参数,int类型的borderTypr,用于推断图像外部像素的某种边界模式,默认BORDER_DEFAULT,无需理会
5种滤波综合示例
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80#include<opencv2/core/core.hpp> #include<opencv2/highgui/highgui.hpp> #include<opencv2/imgproc/imgproc.hpp> using namespace std; using namespace cv; //全局变量申明 Mat g_srcImage, g_dstImage1, g_dstImage2, g_dstImage3, g_dstImage4, g_dstImage5; int g_nBoxFilterValue = 6;//方框滤波内核值 int g_nMeanBlurValue = 10;//均值滤波内核值 int g_nGaussianBlurValue = 6;//高斯滤波内核值 int g_nMedianBlurValue = 10;//中值滤波参数值 int g_nBilateralFilterValue = 10;//双边滤波参数值 //全局函数申明 static void on_BoxFilter(int, void*); static void on_MeanBlur(int, void*); static void on_GaussianBlur(int, void*); static void on_MedianBlur(int, void*); static void on_BilateralFilter(int, void*); //控制台应用程序入口函数 int main() { system("color 5E"); g_srcImage = imread("1.jpg", 1); if (!g_srcImage.data) { printf("读取srcImage错误n"); return false; } g_dstImage1 = g_srcImage.clone(); g_dstImage2 = g_srcImage.clone(); g_dstImage3 = g_srcImage.clone(); g_dstImage4 = g_srcImage.clone(); g_dstImage5 = g_srcImage.clone(); //显示原图 namedWindow("[0]原图", 1); imshow("[0]原图", g_srcImage); //-----------方框滤波--------------- namedWindow("[1]方框滤波", 1); //创建轨迹条 createTrackbar("内核值:", "[1]方框滤波", &g_nBoxFilterValue, 50, on_BoxFilter); on_MeanBlur(g_nBilateralFilterValue, 0); imshow("[1]方框滤波", g_dstImage1); //----------均值滤波---------------- namedWindow("[2]均值滤波", 1); createTrackbar("内核值:", "[2]均值滤波", &g_nMeanBlurValue, 50, on_MeanBlur); on_MeanBlur(g_nMeanBlurValue, 0); //----------高斯滤波---------------- namedWindow("[3]高斯滤波", 1); createTrackbar("内核值:", "[3]高斯滤波", &g_nGaussianBlurValue, 50, on_GaussianBlur); on_GaussianBlur(g_nGaussianBlurValue, 0); //----------中值滤波---------------- namedWindow("[4]中值滤波", 1); createTrackbar("内核值:", "[4]中值滤波", &g_nMedianBlurValue, 50, on_MedianBlur); on_MedianBlur(g_nMedianBlurValue, 0); //----------双边滤波---------------- namedWindow("[5]双边滤波", 1); createTrackbar("内核值:", "[5]双边滤波", &g_nBilateralFilterValue, 50, on_BilateralFilter); on_BilateralFilter(g_nBilateralFilterValue, 0); while(char(waitKey(1))!='q'){} return 0; } static void on_BoxFilter(int, void*) { boxFilter(g_srcImage, g_dstImage1,-1, Size(g_nBoxFilterValue+1, g_nBoxFilterValue + 1)); imshow("[1]方框滤波", g_dstImage1); } static void on_MeanBlur(int, void*) { blur(g_srcImage, g_dstImage2, Size(g_nMeanBlurValue + 1, g_nMeanBlurValue + 1), Point(-1, -1)); imshow("[2]均值滤波", g_dstImage2); } static void on_GaussianBlur(int, void*) { GaussianBlur(g_srcImage, g_dstImage3, Size(g_nGaussianBlurValue *2+ 1, g_nGaussianBlurValue*2 + 1),0,0); imshow("[3]高斯滤波", g_dstImage3); } static void on_MedianBlur(int, void*) { medianBlur(g_srcImage, g_dstImage4,g_nMedianBlurValue*2+1); imshow("[4]中值滤波", g_dstImage4); } static void on_BilateralFilter(int, void*) { bilateralFilter(g_srcImage, g_dstImage5, g_nBilateralFilterValue, g_nBilateralFilterValue*2, g_nBilateralFilterValue/2); imshow("[5]双边滤波", g_dstImage5); }
最后
以上就是单薄小兔子最近收集整理的关于线性滤波+非线性滤波的全部内容,更多相关线性滤波+非线性滤波内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复