• OpenCV探索之路(三):滤波操作


    滤波处理分为两大类:线性滤波和非线性滤波。OpenCV里有这些滤波的函数,使用起来非常方便,现在简单介绍其使用方法。

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

    方框滤波

    #include<opencv2opencv.hpp>   
    #include<opencv2highguihighgui.hpp>
    
    using namespace std;
    using namespace cv;
    
    
    int main()
    {
    	Mat img = imread("lol4.jpg");
    	imshow("原始图", img);
    	Mat out;
    	boxFilter(img, out, -1, Size(5, 5));//-1指原图深度
    	imshow("方框滤波", out);
    	waitKey(0);
    
    }
    

    均值滤波
    均值滤波就是方框滤波的一个特殊情况。
    均值滤波的缺点就是不能很好地保护细节,在图像去燥的同时也破坏了图像的而细节部分,从而使图像变得模糊,不能很好的去除噪点。

    #include<opencv2opencv.hpp>   
    #include<opencv2highguihighgui.hpp>
    
    using namespace std;
    using namespace cv;
    
    
    int main()
    {
    	Mat img = imread("lol4.jpg");
    	imshow("原始图", img);
    	Mat out;
    	blur(img, out,Size(5, 5));//-1指原图深度
    	imshow("均值滤波", out);
    	waitKey(0);
    
    }
    

    高斯滤波
    高斯滤波,可以消除高斯噪声,广泛应用于图像处理的减噪过程。

    #include<opencv2opencv.hpp>   
    #include<opencv2highguihighgui.hpp>
    
    using namespace std;
    using namespace cv;
    
    
    int main()
    {
    	Mat img = imread("lol4.jpg");
    	imshow("原始图", img);
    	Mat out;
    	GaussianBlur(img, out, Size(3, 3), 0, 0);
    	imshow("高斯滤波", out);
    	waitKey(0);
    
    }
    

    从效果看出,高斯滤波的而模糊感明显降低

    非线性滤波:中值滤波、双边滤波

    中值滤波

    基本思想就是用像素点的领域灰度的中值来代替该像素点的灰度值,该方法在去除脉冲噪声、椒盐噪声的同时又能保留图像的细节(不会出现边缘模糊的情况)

    中值滤波跟均值滤波的思想看起来很相似,只是一个取平均值,一个取中位数而已

    #include<opencv2opencv.hpp>   
    #include<opencv2highguihighgui.hpp>
    
    using namespace std;
    using namespace cv;
    
    //中值滤波
    int main()
    {
    	Mat img = imread("lol4.jpg");
    	imshow("原始图", img);
    	Mat out;
    	medianBlur(img, out, 7);//第三个参数表示孔径的线性尺寸,它的值必须是大于1的奇数
    	imshow("中值滤波", out);
    	waitKey(0);
    
    }
    

    现在说说中值滤波与均值滤波的比较:均值滤波中噪声成分会被加入到平均计算,所以输出是受到噪声的影响的。但是中值滤波中,由于噪声成分很难选上,所以基本不影响输出。当然好的性能也需要付出一点代价的,中值滤波花费的时间是均值滤波的5倍以上。

    中值滤波一般采用奇数的卷积核。

    中值滤波对一些细节多(特别是细、尖顶的)的图像不太适合。

    双边滤波

    双边滤波的最大特点就是做边缘保存。

    #include<opencv2opencv.hpp>   
    #include<opencv2highguihighgui.hpp>
    
    using namespace std;
    using namespace cv;
    
    //双边滤波
    int main()
    {
    	Mat img = imread("lol4.jpg");
    	imshow("原始图", img);
    	Mat out;
    	bilateralFilter(img, out, 25, 25 * 2, 25 / 2);
    	imshow("双边滤波", out);
    	waitKey(0);
    
    }
    

    效果图看来,双边滤波是所有滤波中最清晰的。

  • 相关阅读:
    easyui使用datagrid时列名包含特殊字符导致表头与数据错位的问题
    解析:使用easyui的form提交表单,在IE下出现类似附件下载时提示是否保存的现象
    使用PreApplicationStartMethodAttribute
    Entity Framework使用Sqlite时的一些配置
    如何自己编写一个easyui插件续
    如何自己编写一个easyui插件
    启动报错:java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener
    Tomcat启动报错:java.net.BindException: Cannot assign requested address: JVM_Bind
    Maven项目Eclipse启动时报错: java.lang.ClassNotFoundException: org.springframework.web.util.IntrospectorCleanupListener
    ORA-12519, TNS:no appropriate service handler found(数据库上当前的连接数目已经超过最大值)
  • 原文地址:https://www.cnblogs.com/skyfsm/p/6873188.html
Copyright © 2020-2023  润新知