#include<iostream>
#include<opencv2\imgproc\imgproc.hpp>
#include<opencv2\highgui\highgui.hpp>
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;
}