【滤波与卷积(二)】


1、方框滤波:boxFilter函数的使用

结果

在这里插入图片描述

C++代码示例

#include<opencv2/opencv.hpp>
#include<string>
using namespace cv;

std::string image_path = "F:/images/renwu1.jpg";
std::string boxFilter_original = "boxFilterOriginal";
std::string boxFilter_result = "boxFilterResult";

static void test()
{
	// 1、读取图像
	Mat image = imread(image_path);

	//2、创建窗口
	namedWindow(boxFilter_original, WINDOW_AUTOSIZE);
	namedWindow(boxFilter_result, WINDOW_AUTOSIZE);
	//3、显示原图
	imshow(boxFilter_original, image);

	//4、进行方框滤波操作
	Mat result;
	boxFilter(image, result, -1, Size(5, 5));

	//5、显示效果图
	imshow(boxFilter_result, result);

	waitKey(0);
}

int main()
{
	test();
	system("pause");
	return 0;
}

2、均值滤波:blur函数的使用

结果

均值滤波

C++代码示例

#include<opencv2/opencv.hpp>
#include<string>
using namespace cv;

std::string image_path = "F:/images/renwu1.jpg";
std::string blur_original = "blurOriginal";
std::string blur_result = "blurResult";


static void  test()
{
	//1、载入原始图
	Mat srcImage = imread(image_path);

	//2、显示原始图
	imshow(blur_original, srcImage);

	//3、进行均值滤波操作
	Mat dstImage;
	blur(srcImage, dstImage, Size(7, 7));

	//4、显示效果图
	imshow(blur_result, dstImage);

	waitKey(0);
}

int main()
{
	test();
	system("pause");
	return 0;
}

3、高斯滤波:GaussianBlur函数的使用

结果

高斯滤波

C++代码示例


#include<opencv2/opencv.hpp>
#include<string>
using namespace cv;

std::string image_path = "F:/images/renwu1.jpg";
std::string gaussian_blur_original = "GaussianBlurOriginal";
std::string gaussian_blur_result = "GaussianBlurResult";

static void test()
{
	//1、 载入原图
	Mat image = imread(image_path);

	//2、创建窗口
	namedWindow(gaussian_blur_original);
	namedWindow(gaussian_blur_result);

	//3、显示原图
	imshow(gaussian_blur_original, image);

	//4、进行高斯滤波操作
	Mat result;
	GaussianBlur(image, result, Size(5, 5), 0, 0);

	//5、显示效果图
	imshow(gaussian_blur_result, result);

	waitKey(0);
}

int main()
{
	test();
	system("pause");
	return 0;
}

4、综合示例:图像线性滤波

结果

在这里插入图片描述

C++代码示例

#include<opencv2/opencv.hpp>
#include<string>
using namespace cv;
using namespace std;

std::string image_path = "F:/images/renwu1.jpg";
std::string image_original = "Original";
std::string boxFilter_result = "boxFilterResult";
std::string blur_result = "blurResult";
std::string gaussian_blur_result = "GaussianBlurResult";


Mat g_srcImage, g_dstImage1, g_dstImage2, g_dstImage3;//存储图片的Mat类型
int g_nBoxFilterValue = 3;  //方框滤波参数值
int g_nMeanBlurValue = 3;  //均值滤波参数值
int g_nGaussianBlurValue = 3;  //高斯滤波参数值


//回调函数
static void FunBoxFilter(int, void *);		//均值滤波
static void FunMeanBlur(int, void *);		//均值滤波
static void FunGaussianBlur(int, void *);	//高斯滤波



static void  test()
{
	//改变console字体颜色
	system("color 5F");
	//1、 载入原图
	g_srcImage = imread(image_path, 1);
	if (!g_srcImage.data) { cout << "not load image!! \n"; return; }

	//2、克隆原图到三个Mat类型中
	g_dstImage1 = g_srcImage.clone();
	g_dstImage2 = g_srcImage.clone();
	g_dstImage3 = g_srcImage.clone();

	//3、显示原图
	namedWindow(image_original, 1);
	imshow(image_original, g_srcImage);


	//=================【<1>方框滤波】==================
	//创建窗口
	namedWindow(boxFilter_result, 1);
	//创建轨迹条
	createTrackbar("内核值:", boxFilter_result, &g_nBoxFilterValue, 40, FunBoxFilter);
	FunBoxFilter(g_nBoxFilterValue, 0);
	//================================================

	//=================【<2>均值滤波】==================
	//创建窗口
	namedWindow(blur_result, 1);
	//创建轨迹条
	createTrackbar("内核值:", blur_result, &g_nMeanBlurValue, 40, FunMeanBlur);
	FunMeanBlur(g_nMeanBlurValue, 0);
	//================================================

	//=================【<3>高斯滤波】=====================
	//创建窗口
	namedWindow(gaussian_blur_result, 1);
	//创建轨迹条
	createTrackbar("内核值:", gaussian_blur_result, &g_nGaussianBlurValue, 40, FunGaussianBlur);
	FunGaussianBlur(g_nGaussianBlurValue, 0);
	//================================================


	//输出一些帮助信息
	cout << endl << "\t运行成功,请调整滚动条观察图像效果~\n\n"
		<< "\t按下“q”键时,程序退出。\n";

	//按下“q”键时,程序退出
	while (char(waitKey(1)) != 'q') {}

	return;
}

int main()
{
	test();
	system("pause");
	return 0;
}


static void FunBoxFilter(int, void *)
{
	//方框滤波操作
	boxFilter(g_srcImage, g_dstImage1, -1, Size(g_nBoxFilterValue + 1, g_nBoxFilterValue + 1));
	//显示窗口
	imshow(boxFilter_result, g_dstImage1);
}


static void FunMeanBlur(int, void *)
{
	//均值滤波操作
	blur(g_srcImage, g_dstImage2, Size(g_nMeanBlurValue + 1, g_nMeanBlurValue + 1), Point(-1, -1));
	//显示窗口
	imshow(blur_result, g_dstImage2);
}


static void FunGaussianBlur(int, void *)
{
	//高斯滤波操作
	GaussianBlur(g_srcImage, g_dstImage3, Size(g_nGaussianBlurValue * 2 + 1, g_nGaussianBlurValue * 2 + 1), 0, 0);
	//显示窗口
	imshow(gaussian_blur_result, g_dstImage3);
}

5、中值滤波:medianBlur函数的使用

结果

在这里插入图片描述

C++代码示例

#include<opencv2/opencv.hpp>
#include<string>
using namespace cv;

std::string image_path = "F:/images/renwu1.jpg";
std::string median_blur_original = "medianBlurOriginal";
std::string median_blur_result = "medianBlurResult";

static void test()
{
	//1、 载入原图
	Mat image = imread(image_path);

	//2、创建窗口
	namedWindow(median_blur_original,WINDOW_AUTOSIZE);
	namedWindow(median_blur_result,WINDOW_AUTOSIZE);

	//3、显示原图
	imshow(median_blur_original, image);

	//进行中值滤波操作
	Mat result;
	medianBlur(image, result, 7);

	//4、显示效果图
	imshow(median_blur_result, result);

	waitKey(0);
}

int main()
{
	test();
	system("pause");
	return 0;
}

6、双边滤波:bilateralFilter函数的使用

结果

在这里插入图片描述

C++代码示例

#include<opencv2/opencv.hpp>
#include<string>
using namespace cv;

std::string image_path = "F:/images/renwu1.jpg";
std::string bilateralFilter_original = "bilateralFilterOriginal";
std::string bilateralFilter_result = "bilateralFilterResult";

static void test()
{
	//1、 载入原图
	Mat srcImage = imread(image_path);

	//2、创建窗口
	namedWindow(bilateralFilter_original);
	namedWindow(bilateralFilter_result);

	//3、显示原图
	imshow(bilateralFilter_original, srcImage);

	//4、进行双边滤波操作
	Mat result;
	bilateralFilter(srcImage, result, 25, 25 * 2, 25 / 2);

	//5、显示效果图
	imshow(bilateralFilter_result, result);

	waitKey(0);
}

int main()
{
	test();
	system("pause");
	return 0;
}

7、综合示例:图像滤波

结果

在这里插入图片描述

C++代码示例

#include<opencv2/opencv.hpp>
#include<string>
using namespace cv;
using namespace std;

std::string image_path = "F:/images/renwu1.jpg";
std::string image_original = "Original";
std::string median_blur_result = "medianBlurResult";
std::string bilateralFilter_result = "bilateralFilterResult";

Mat g_srcImage, g_dstImage1, g_dstImage2;
int g_nMedianBlurValue = 10;       //中值滤波参数值
int g_nBilateralFilterValue = 10;  //双边滤波参数值



//回调函数
static void FunMedianBlur(int, void *);		//中值滤波器
static void FunBilateralFilter(int, void *);//双边滤波器


static void test()
{
	system("color 4F");
	// 载入原图
	g_srcImage = imread(image_path, 1);
	if (!g_srcImage.data) { std::cout << "image not load! \n"; return; }

	//克隆原图到四个Mat类型中
	g_dstImage1 = g_srcImage.clone();
	g_dstImage2 = g_srcImage.clone();
	//显示原图
	namedWindow(image_original, WINDOW_AUTOSIZE);
	imshow(image_original, g_srcImage);

	//=================【<2>中值滤波】===========================
	//创建窗口
	namedWindow(median_blur_result, WINDOW_AUTOSIZE);
	//创建轨迹条
	createTrackbar("参数值:", median_blur_result, &g_nMedianBlurValue, 50, FunMedianBlur);
	FunMedianBlur(g_nMedianBlurValue, 0);
	//=======================================================


	//=================【<3>双边滤波】===========================
	//创建窗口
	namedWindow(bilateralFilter_result, 1);
	//创建轨迹条
	createTrackbar("参数值:", bilateralFilter_result, &g_nBilateralFilterValue, 50, FunBilateralFilter);
	FunBilateralFilter(g_nBilateralFilterValue, 0);
	//=======================================================


	//输出一些帮助信息
	cout << endl << "\t运行成功,请调整滚动条观察图像效果~\n\n"
		<< "\t按下“q”键时,程序退出。\n";
	while (char(waitKey(1)) != 'q') {}

	return;
}

int main()
{
	test();
	system("pause");
	return 0;
}


static void FunMedianBlur(int, void *)
{
	medianBlur(g_srcImage, g_dstImage1, g_nMedianBlurValue * 2 + 1);
	imshow(median_blur_result, g_dstImage1);
}


static void FunBilateralFilter(int, void *)
{
	bilateralFilter(g_srcImage, g_dstImage2, g_nBilateralFilterValue, g_nBilateralFilterValue * 2, g_nBilateralFilterValue / 2);
	imshow(bilateralFilter_result, g_dstImage2);
}


8、膨胀:dilate函数的使用

结果

在这里插入图片描述

C++代码示例

#include<opencv2/opencv.hpp>
#include<string>
using namespace cv;

std::string image_path = "1.jpg";
std::string dilate_original = "dilateOriginal";
std::string dilate_result = "dilateResult";

static void test()
{

	//1、载入原图  
	Mat src_image = imread(image_path);

	//2、创建窗口  
	namedWindow(dilate_original, WINDOW_AUTOSIZE);
	namedWindow(dilate_result, WINDOW_AUTOSIZE);

	//3、显示原图
	imshow(dilate_original, src_image);

	//4、进行膨胀操作 
	Mat element = getStructuringElement(MORPH_RECT, Size(15, 15));
	Mat result;
	dilate(src_image, result, element);

	//6、显示效果图 
	imshow(dilate_result, result);

	waitKey(0);
}

int main()
{
	test();
	system("pause");
	return 0;
}

9、腐蚀:erode函数的使用

结果

在这里插入图片描述

C++代码示例

#include<opencv2/opencv.hpp>
#include<string>
using namespace cv;

std::string image_path = "1.jpg";
std::string erode_original = "erodeOriginal";
std::string erode_result = "erodeResult";

static void test()
{
	//1、载入原图  
	Mat srcImage = imread(image_path);
	//2、显示原图
	imshow(erode_original, srcImage);
	//3、进行腐蚀操作 
	Mat element = getStructuringElement(MORPH_RECT, Size(15, 15));
	Mat dstImage;
	erode(srcImage, dstImage, element);
	//4、显示效果图 
	imshow(erode_result, dstImage);
	waitKey(0); 
}

int main()
{
	test();
	system("pause");
	return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值