OpenCV学习笔记——滤波器实践

#include
#include
#include

using namespace cv;

#define WINDOW_NAME "【图像平滑与图像增强实验_OpenCV】"



//-------------------------------------【全局函数声明】------------------------------------------
//	描述:全局函数声明
//-------------------------------------------------------------------------------------------
void on_Trackerbar_BoxFilter(int kSize, void *);
void on_Trackerbar_Blur(int kSize, void *);
void on_Trackerbar_GaussianBlur(int kSize, void *);
void on_Trackerbar_MedianBlur(int kSize, void *);
void on_Trackerbar_BilateralFilter(int kSize, void *);
//-------------------------------------【全局变量】------------------------------------------
//	描述:全局变量声明
//-------------------------------------------------------------------------------------------
RNG g_rng(12345);
cv::Mat srcImage;
cv::Mat srcGray;
cv::Mat dstImage;

//-------------------------------------【main()函数】----------------------------------------
//	描述:控制台应用程序的入口函数
//-------------------------------------------------------------------------------------------
int main(int argc, char **argv)
{
	//加载图像
	srcImage = imread("G:\\VS_File\\Picture\\lena.jpg");
	if (srcImage.empty())
	{
		std::cout << "Image 1 is None!";
		cv::waitKey(0);
		return -1;
	}
	cv::imshow(WINDOW_NAME, srcImage);
	//转换为灰度图像
	cv::cvtColor(srcImage, srcGray, CV_BGR2GRAY);
	//cv::imshow("SrcGray", srcGray);
	/************************************************************************************************************************/
	//盒滤波器
	int box_size = 1;
	int box_size_max = 10;
	createTrackbar("Box滤波", WINDOW_NAME, &box_size, box_size_max, on_Trackerbar_BoxFilter);
	on_Trackerbar_BoxFilter(box_size,0);
	//均值滤波器(实际即盒滤波器)
	int blur_size = 1;
	int blur_size_max = 10;
	createTrackbar("Blur滤波", WINDOW_NAME, &blur_size, blur_size_max, on_Trackerbar_Blur);
	on_Trackerbar_Blur(blur_size, 0);
	//高斯滤波器
	int GaussianBlur_size = 1;
	int GaussianBlur_size_max = 10;
	createTrackbar("GaussianBlur滤波", WINDOW_NAME, &GaussianBlur_size, GaussianBlur_size_max, on_Trackerbar_GaussianBlur);
	on_Trackerbar_GaussianBlur(GaussianBlur_size, 0);
	/************************************************************************************************************************/
	//非线性滤波器
	//中值滤波器
	int MedianBlur_size = 1;
	int MedianBlur_size_max = 10;
	createTrackbar("MedianBlur滤波", WINDOW_NAME, &MedianBlur_size, MedianBlur_size_max, on_Trackerbar_MedianBlur);
	on_Trackerbar_MedianBlur(MedianBlur_size, 0);

	//双边滤波器
	int BilateralFilter_size = 10;
	int BilateralFilter_size_max = 100;
	createTrackbar("Bilateral滤波", WINDOW_NAME, &BilateralFilter_size, BilateralFilter_size_max, on_Trackerbar_BilateralFilter);
	on_Trackerbar_BilateralFilter(BilateralFilter_size, 0);
	/************************************************************************************************************************/

	cv::waitKey(0);
	cv::destroyAllWindows();
	return 0;
}


//------------------------------【On_Trackbar()回调函数】-----------------------------------
//	描述:响应滑动条的回调函数
//-------------------------------------------------------------------------------------------
//滤波器的回调函数(其实就是调用了盒滤波器)
void on_Trackerbar_Blur(int kSize, void *)
{
	cv::Size size(kSize * 2 + 1, kSize * 2 + 1);
	cv::Point point(-1, -1);
	blur(srcGray, dstImage, size, point, 4);
	cv::imshow("BlurImage", dstImage);
	std::cout << "Blur 滤波窗口大小为 " << (kSize * 2 + 1) << " 的滤波结果如图所示" << std::endl;
}
//盒滤波器的回调函数
void on_Trackerbar_BoxFilter(int kSize, void *)
{
	cv::Size size(kSize*2+1, kSize * 2 +1);
	cv::Point point(-1, -1);
	boxFilter(srcGray, dstImage, srcGray.depth(), size, point, true, 4);
	cv::imshow("BoxFiltImage", dstImage);
	std::cout << "BoxFilter滤波窗口大小为 " << (kSize * 2 + 1) << " 的滤波结果如图所示" << std::endl;
}
//高斯滤波器的回调函数
void on_Trackerbar_GaussianBlur(int kSize, void *)
{
	cv::Size size(kSize * 2 + 1, kSize * 2 + 1);

	GaussianBlur(srcGray, dstImage, size, 0, 0, 4);
	cv::imshow("GaussianBlurImage", dstImage);
	std::cout << "GaussianBlur滤波窗口大小为 " << (kSize * 2 + 1) << "的滤波结果如图所示" << std::endl;
}
//中值滤波器的回调函数
void on_Trackerbar_MedianBlur(int kSize, void *)
{
	int size = kSize * 2 + 1;
	medianBlur(srcGray, dstImage, size);
	cv::imshow("MedianBlurImage", dstImage);
	std::cout << "GaussianBlur滤波窗口大小为 " << size << "的滤波结果如图所示" << std::endl;
}
//双边滤波器的回调函数
void on_Trackerbar_BilateralFilter(int kSize, void *)
{
	bilateralFilter(srcGray, dstImage, kSize, kSize *2, kSize /2);
	cv::imshow("BilateralFilterImage", dstImage);
	std::cout << "BilateralFilter滤波窗口大小为 " << kSize << "的滤波结果如图所示" << std::endl;
}

OpenCV学习笔记——滤波器实践_第1张图片OpenCV学习笔记——滤波器实践_第2张图片OpenCV学习笔记——滤波器实践_第3张图片OpenCV学习笔记——滤波器实践_第4张图片OpenCV学习笔记——滤波器实践_第5张图片OpenCV学习笔记——滤波器实践_第6张图片



你可能感兴趣的:(OpenCV,C++)