zoukankan      html  css  js  c++  java
  • opencv 4 图像处理 (1 线性滤波,非线性滤波)


    1 线性滤波:方框滤波、均值滤波、高斯滤波





    1.1方框滤波(box Filter)



    1.2均值滤波(blur函数)

    缺陷:


    1.3高斯滤波(GaussianBlur函数)

    1.4线性滤波核心API函数

    boxFilter

    #include "opencv2/core/core.hpp" 
    #include "opencv2/highgui/highgui.hpp" 
    #include "opencv2/imgproc/imgproc.hpp" 
    using namespace cv;
    
    //-----------------------------------【main( )函数】--------------------------------------------
    //	描述:控制台应用程序的入口函数,我们的程序从这里开始
    //-----------------------------------------------------------------------------------------------
    int main()
    {
    	// 载入原图
    	Mat image = imread("1.jpg");
    
    	//创建窗口
    	namedWindow("方框滤波【原图】");
    	namedWindow("方框滤波【效果图】");
    
    	//显示原图
    	imshow("方框滤波【原图】", image);
    
    	//进行方框滤波操作
    	Mat out;
    	boxFilter(image, out, -1, Size(5, 5));
    
    	//显示效果图
    	imshow("方框滤波【效果图】", out);
    
    	waitKey(0);
    }
    

    blur

    #include "opencv2/highgui/highgui.hpp" 
    #include "opencv2/imgproc/imgproc.hpp" 
    using namespace cv; 
    
    //-----------------------------------【main( )函数】--------------------------------------------
    //		描述:控制台应用程序的入口函数,我们的程序从这里开始
    //-----------------------------------------------------------------------------------------------
    int main( )
    { 
    	//【1】载入原始图
    	Mat srcImage=imread("1.jpg"); 
    
    	//【2】显示原始图
    	imshow( "均值滤波【原图】", srcImage ); 
    
    	//【3】进行均值滤波操作
    	Mat dstImage; 
    	blur( srcImage, dstImage, Size(7, 7)); 
    
    	//【4】显示效果图
    	imshow( "均值滤波【效果图】" ,dstImage ); 
    
    	waitKey( 0 );     
    } 
    

    GaussianBlur

    #include "opencv2/core/core.hpp" 
    #include "opencv2/highgui/highgui.hpp" 
    #include "opencv2/imgproc/imgproc.hpp" 
    using namespace cv; 
    
    //-----------------------------------【main( )函数】--------------------------------------------
    //	描述:控制台应用程序的入口函数,我们的程序从这里开始
    //-----------------------------------------------------------------------------------------------
    int main( )
    { 
    	// 载入原图
    	Mat image=imread("1.jpg"); 
    
    	//创建窗口
    	namedWindow( "高斯滤波【原图】" ); 
    	namedWindow( "高斯滤波【效果图】"); 
    
    	//显示原图
    	imshow( "高斯滤波【原图】", image ); 
    
    	//进行高斯滤波操作
    	Mat out; 
    	GaussianBlur( image, out, Size( 5, 5 ), 0, 0 ); 
    
    	//显示效果图
    	imshow( "高斯滤波【效果图】" ,out ); 
    
    	waitKey( 0 );     
    } 
    

    综合实例

    #include <opencv2/core/core.hpp>
    #include <opencv2/highgui/highgui.hpp>
    #include <opencv2/imgproc/imgproc.hpp>
    #include <iostream>
    
    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 *);			//高斯滤波
    void ShowHelpText();
    
    
    //-----------------------------------【main( )函数】--------------------------------------------
    //	描述:控制台应用程序的入口函数,我们的程序从这里开始
    //-----------------------------------------------------------------------------------------------
    int main()
    {
    	//改变console字体颜色
    	system("color 5F");
    
    	//输出帮助文字
    	ShowHelpText();
    
    	// 载入原图
    	g_srcImage = imread("1.jpg", 1);
    	if (!g_srcImage.data) { printf("Oh,no,读取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_MeanBlur(g_nBoxFilterValue, 0);
    	imshow("【<1>方框滤波】", g_dstImage1);
    	//================================================
    
    	//=================【<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));
    	//显示窗口
    	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);
    }
    
    
    //-----------------------------【ContrastAndBright( )函数】------------------------------------
    //	描述:高斯滤波操作的回调函数
    //-----------------------------------------------------------------------------------------------
    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);
    }
    
    
    //-----------------------------------【ShowHelpText( )函数】----------------------------------
    //		 描述:输出一些帮助信息
    //----------------------------------------------------------------------------------------------
    void ShowHelpText()
    {
    	//输出欢迎信息和OpenCV版本 
    	printf("\n\n\t\t\t   当前使用的OpenCV版本为:" CV_VERSION);
    	printf("\n\n  ----------------------------------------------------------------------------\n");
    }
    

    非线性滤波(中值滤波,双边滤波)


    中值滤波(Median filter)(medianBlur函数)






    #include "opencv2/core/core.hpp" 
    #include "opencv2/highgui/highgui.hpp" 
    #include "opencv2/imgproc/imgproc.hpp" 
    
    //-----------------------------------【命名空间声明部分】---------------------------------------
    //	描述:包含程序所使用的命名空间
    //-----------------------------------------------------------------------------------------------  
    using namespace cv;
    
    //-----------------------------------【main( )函数】--------------------------------------------
    //	描述:控制台应用程序的入口函数,我们的程序从这里开始
    //-----------------------------------------------------------------------------------------------
    int main()
    {
    	// 载入原图
    	Mat image = imread("1.jpg");
    
    	//创建窗口
    	namedWindow("中值滤波【原图】");
    	namedWindow("中值滤波【效果图】");
    
    	//显示原图
    	imshow("中值滤波【原图】", image);
    
    	//进行中值滤波操作
    	Mat out;
    	medianBlur(image, out, 7);
    
    	//显示效果图
    	imshow("中值滤波【效果图】", out);
    
    	waitKey(0);
    }
    

    双边滤波(Bilateral filter)(bilateralFilter函数)



    #include "opencv2/core/core.hpp" 
    #include "opencv2/highgui/highgui.hpp" 
    #include "opencv2/imgproc/imgproc.hpp" 
    
    //-----------------------------------【命名空间声明部分】---------------------------------------
    //	描述:包含程序所使用的命名空间
    //-----------------------------------------------------------------------------------------------  
    using namespace cv; 
    
    //-----------------------------------【main( )函数】--------------------------------------------
    //	描述:控制台应用程序的入口函数,我们的程序从这里开始
    //-----------------------------------------------------------------------------------------------
    int main( )
    { 
    	// 载入原图
    	Mat image=imread("1.jpg"); 
    
    	//创建窗口
    	namedWindow( "双边滤波【原图】" ); 
    	namedWindow( "双边滤波【效果图】"); 
    
    	//显示原图
    	imshow( "双边滤波【原图】", image ); 
    
    	//进行双边滤波操作
    	Mat out; 
    	bilateralFilter ( image, out, 25, 25*2, 25/2 ); 
    
    	//显示效果图
    	imshow( "双边滤波【效果图】" ,out ); 
    
    	waitKey( 0 );     
    } 
    

  • 相关阅读:
    springboot springcloud zuul 过滤器
    springboot springcloud eureka 熔断器
    javaweb servlet filter
    maven nexus 搭建私服(二)
    springboot springcloud zuul 网关入门
    springboot springcloud 配置中心
    springboot springcloud eureka 入门
    java rabbitmq
    java jvm调优
    maven nexus 搭建私服(一)
  • 原文地址:https://www.cnblogs.com/xingkongcanghai/p/11175000.html
Copyright © 2011-2022 走看看