概述
方框滤波
函数原型
void 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,无需理会
均值滤波
函数原型
void 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,无需理会
高斯滤波
函数原型
void 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,无需理会
中值滤波(非线性滤波)
函数原型
void 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的奇数。
双边滤波滤波(非线性滤波)
函数原型
void 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种滤波综合示例
#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);
}
最后
以上就是单薄小兔子为你收集整理的线性滤波+非线性滤波的全部内容,希望文章能够帮你解决线性滤波+非线性滤波所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复