图像处理(opencv3编程入门第六章)第一节 线性滤波

图像处理(opencv3编程入门第六章)第一节 线性滤波

转载自https://blog.csdn.net/qq_35294564/article/details/81142524

处理方法介绍

1.平滑处理

Smoothing or bluring(模糊处理)。最常见的用途时用来减少图像上的噪点或者失真;降低图像的分辨率。

2.图像滤波与滤波器

  1. 图像滤波的目的有两个:特征提取和消除噪声。
  2. 关于滤波器,可以把它想象成一个包含加权系数的窗口。进行滤波时,这个窗口进行滑动,通过加权系数计算得到滤波后的结果。

3.线性滤波器

包括低通,高通,带通,带阻,全通,陷波。注意,低通相当于模糊,高通相当于锐化。

4.方框滤波

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)的写法来表示内核的大小,例如Size(3,3)就是3×3的核大小;
  • 第五个参数,Point类型的anchor,表示锚点(即被平滑的那个点),注意有默认值Point(-1,-1),如果这个点坐标是负值的话就表示取核中心为锚点;
  • 第六个参数,bool类型的normalize,默认值为true,一个标识符,表示内核是否被其区域归一化了;
  • 第七个参数,int类型的borderType,用于推断图像外部像素的某种边界模式,有默认值BORDER_DEFAULT,一般不去管它。

如果我们要在可变的窗口中计算像素总和,可以使用integral()函数。

5.均值滤波

C++:  void blur(InputArray src,OutputArray,dst,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,以源图片为模板来初始化得到如假包换的目标图;
  • 第三个参数,Size类型的ksize,内核的大小,一般用Size(w,h)的写法来表示内核的大小,例如Size(3,3)就是3×3的核大小;
  • 第四个参数,Point类型的anchor,表示锚点(即被平滑的那个点),注意有默认值Point(-1,-1),如果这个点坐标是负值的话就表示取核中心为锚点;
  • 第五个参数,int类型的borderType,用于推断图像外部像素的某种边界模式,有默认值BORDER_DEFAULT,一般不去管它。

6.高斯滤波

C++: 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,即目标图像,需要和原图像有一样的尺寸和类型;比如可以用Mat::clone,以源图片为模板来初始化得到如假包换的目标图;
  • 第三个参数,Size类型的ksize,内核的大小,一般用Size(w,h)的写法来表示内核的大小,ksize.width和ksize.height可以不同,但必须是正数&&奇数!!
  • 第四个参数,double类型的sigmaX,表示高斯核函数在X方向上的标准差;
  • 第五个参数,double类型的sigmaY,表示高斯核函数在Y方向上的标准差。若sigmaY为零,就将它设为sigmaX,如果sigmaX和sigmaY都为零,那就由ksize.width和ksize.hight计算出来。为了结果的正确性着想,最好把第三个参数Size,第四个参数sigmaX,第五个参数sigmaY全部制定好;
  • 第六个参数,int类型的borderType,用于推断图像外部像素的某种边界模式,有默认值BORDER_DEFAULT,一般不去管它。

示例代码

#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
 
//全局变量声明部分
Mat g_srcImage, g_dstImage1, g_dstImage2, g_dstImage3;//存储图片的Mat类型
int g_nBoxFilterValue = 3;//方框滤波参数值
int g_nMeanBlurValue = 3;//均值滤波参数值
int g_nGaussianBlurValue = 3;//高斯滤波参数值
 
//全局函数声明部分
static void on_BoxFilter(int, void *);
static void on_MeanBlur(int, void *);
static void on_GaussianBlur(int, void *);
 
//main()函数
int main() {
	//改变console字体颜色
	system("color5E");
 
	//载入原图
	g_srcImage = imread("1.jpg", 1);//载入三通道彩色图像
	if (!g_srcImage.data) {
		printf("读取srcImage错误!\n");
		return false;
	}
 
	//复制原图到三个Mat类型中
	g_dstImage1 = g_srcImage.clone();//初始化目标图像大小,类型
	g_dstImage2 = g_srcImage.clone();
	g_dstImage3 = g_srcImage.clone();
 
	//显示原图
	namedWindow("<0>原图窗口",1);
	imshow("<0>原图窗口", g_srcImage);
 
	//====================【<1>方框滤波】=====================
	//创建窗口
	namedWindow("<1>方框滤波", 1);
	//创建轨迹条
	createTrackbar("内核值:", "<1>方框滤波", &g_nBoxFilterValue, 40, on_BoxFilter);
	on_BoxFilter(g_nBoxFilterValue, 0);//回调函数参数初始化
	//=========================================================
 
	//=====================【<2>均值滤波】=====================
	namedWindow("<2>均值滤波", 1);
	createTrackbar("内核值:", "<2>均值滤波", &g_nMeanBlurValue, 40, on_MeanBlur);
	on_MeanBlur(g_nMeanBlurValue, 0);
	//=========================================================
 
	//=====================【<3>高斯滤波】=====================
	namedWindow("<3>高斯滤波", 1);
	createTrackbar("内核值:", "<3>高斯滤波", &g_nGaussianBlurValue, 40, on_GaussianBlur);
	on_GaussianBlur(g_nGaussianBlurValue, 0);
	//=========================================================
	
	//输出一些帮助信息
	cout << endl << "\t,请调整轨迹条观察图像效果!\n\n" << "\t按下‘Q’键,程序退出!\n";
	//按下Q键程序退出
	while(char(waitKey(1))!='q'){}
 
	return 0;
}
 
//=======================【on_BoxFilter()函数】==============================
static void on_BoxFilter(int, void *) {//回调函数参数格式
	//方框滤波操作
	boxFilter(g_srcImage, g_dstImage1, -1, Size(g_nBoxFilterValue + 1, g_nBoxFilterValue + 1));//ddepth=1,dst为原图深
	//显示窗口
	imshow("<1>方框滤波", g_dstImage1);
}
 
//=======================【on_MeanBlur()函数】===============================
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);
}
 
//=======================【on_GaussianBlur()函数】===========================
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);
}
--------------------- 
作者:衣带渐宽人憔悴 
来源:CSDN 
原文:https://blog.csdn.net/qq_35294564/article/details/81142524 
版权声明:本文为博主原创文章,转载请附上博文链接!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值