• opencv之模糊处理


    初学OpenCV的开发者很容易被OpenCV中各种滤波方法所困扰,不知道到底该用哪里一个来做滤波。表面原因看起来是因为OpenCV中各种滤波方式实在是太多太杂,

    其背后原因是对各种滤波方法的应用场景认知出现了问题,所以这里小编从应用场景与项目中解决问题的实际出发,跟大家一起探讨一下各种滤波方法。

    一:模糊函数blur

     

    参数说明

     

    -参数InputArray表示输入图像Mat对象

    -参数OutputArray表示模糊之后输出Mat对象

    -参数Size表示卷积核大小,此参数决定模糊程度,Size(x, y)其中x, y取值越大表现模糊程度越深,而且X与Y的值为奇数。

    -参数Point表示锚定的位置,也就是卷积核替换重叠像素中的哪个位置。此参数一般使用Point(-1,-1)表示使用卷积核的中心位置。

    -最后一个参数表示对边缘的处理方法,一般默认4表示默认处理方法

    XY方向模糊-示例代码:

    #include<opencv2/opencv.hpp>
    #include<iostream>
    int main(){
    cv::Mat m1 = cv::imread("D:/640.jpg",4);
    cv::Mat m2;
    cv::namedWindow("windows",CV_WINDOW_AUTOSIZE);
    cv::imshow("windows",m1);
    cv::blur(m1,m2,cv::Size(5,5),cv::Point(-1,-1),4);
    cv::namedWindow("windows1", CV_WINDOW_AUTOSIZE);
    cv::imshow("windows1", m2);
    cv::waitKey(0);
    return 0;
    }

    应用场景:

    通过blur函数一般来去除噪声,可以在图像边缘提取、特征提取之前对图像进行大小为3x3的模糊以此来达到去掉干扰和噪声目的

    二:高斯模糊函数GaussianBlur

     

    参数说明

     

    -参数InputArray表示输入图像Mat对象

    -参数OutputArray表示模糊之后输出Mat对象

    -参数Size表示卷积核大小,此参数决定模糊程度,Size(x, y)其中x, y取值越大表现模糊程度越深,而且X与Y的值为奇数。

    -参数SigmaX表示高斯方程中X方向的标准方差

    -参数SigmaY表示高斯方程中X方向的标准方差

    -最后一个参数表示对边缘的处理方法,一般默认4表示默认处理方法

    其中Size大小表示高斯卷积核、必须是奇数而且必须是正数、SigmaX在当Size大小不为零的时候直接从Size大小计算、SigmaY在SigmaX不为零的时候从X计算、SigmaX为零的时候从Size大小中计算。

    高斯模糊卷积核大小5x5-示例代码

    #include<opencv2/opencv.hpp>
    #include<iostream>
    int main(){
    cv::Mat m1 = cv::imread("D:/640.jpg",4);
    cv::Mat m2;
    cv::namedWindow("windows",CV_WINDOW_AUTOSIZE);
    cv::imshow("windows",m1);
    cv::GaussianBlur(m1,m2,cv::Size(5,5),0,0);
    cv::namedWindow("windows1", CV_WINDOW_AUTOSIZE);
    cv::imshow("windows1", m2);
    cv::waitKey(0);
    return 0;
    }

    #include<opencv2/opencv.hpp>
    #include<iostream>
    int main(){
    cv::Mat m1 = cv::imread("D:/640.jpg",4);
    cv::Mat m2;
    cv::namedWindow("windows",CV_WINDOW_AUTOSIZE);
    cv::imshow("windows",m1);
    cv::GaussianBlur(m1,m2,cv::Size(0,0),15,15);
    cv::namedWindow("windows1", CV_WINDOW_AUTOSIZE);
    cv::imshow("windows1", m2);
    cv::waitKey(0);
    return 0;
    }

    应用场景:

    高斯模糊的应用场景一般作为退化函数使用,可以去除图像噪声,Canny边缘提取的第一步就是高斯模糊,以此来消除噪声干扰,用高斯模糊去噪对于随机噪声效果明显。

    三:中值滤波函数-medianBlur

     

    参数说明:

     

    -参数InputArray表示输入图像Mat对象

    -参数OutputArray表示模糊之后输出Mat对象

    -参数ksize表示卷积核大小,必须是正数而且必须是大于1,如:3、5、7等。

    共有三个参数、其中第一个表示输入图像Mat对象,第二个表示滤波结果输出Mat对象、第三个参数则表示卷积核的大小。

    中值滤波-代码示例

    #include<opencv2/opencv.hpp>
    #include<iostream>
    int main(){
    cv::Mat m1 = cv::imread("D:/640.jpg",4);
    cv::Mat m2;
    cv::namedWindow("windows",CV_WINDOW_AUTOSIZE);
    cv::imshow("windows",m1);
    cv::medianBlur(m1,m2,5);
    cv::namedWindow("windows1", CV_WINDOW_AUTOSIZE);
    cv::imshow("windows1", m2);
    cv::waitKey(0);
    return 0;
    }

    应用场景:

    从上面的例子我们可以看出,中值滤波对椒盐噪声的图像有比较好的效果,可以去除图像中像素极大或者极小值。

    四:双边模糊函数-bilateralFilter

    参数说明:

     

    -参数InputArray表示输入图像Mat对象

    -参数OutputArray表示模糊之后输出Mat对象

    -参数d表示双边滤波时候中心到周围像素距离

    -参数sigmaColor表示高斯核中颜色值标准方差

    -参数sigmaSpace表示高斯核中空间的标准方差

    -参数borderType表示边缘的处理方法

    一共六个参数,其中如果参数d没有申明的话或者是负数的话就从sigmaSpace中计算得到即可。常见的d取值为15或者20如果过大会导致运算时间较长。

    #include<opencv2/opencv.hpp>
    #include<iostream>
    int main(){
    cv::Mat m1 = cv::imread("D:/640.jpg",4);
    cv::Mat m2;
    cv::namedWindow("windows",CV_WINDOW_AUTOSIZE);
    cv::imshow("windows",m1);
    cv::bilateralFilter(m1,m2,15,120,10,4);
    cv::namedWindow("windows1", CV_WINDOW_AUTOSIZE);
    cv::imshow("windows1", m2);
    cv::waitKey(0);
    return 0;
    }

    应用场景:

    高斯双边滤波经常被用来实现图像美化类APP用来做高斯磨皮核心算法,然后基于SOBEL算子进行叠加处理,通过高斯模糊得到最终结果。效果异常明显,是一个不错的选择。

    五:滤波函数filter2D

    参数说明

     

    -参数InputArray表示输入图像Mat对象

    -参数OutputArray表示模糊之后输出Mat对象

    -参数d表输出图像的深度,-1表示跟输入图像深度相同。

    -参数kernel表示自定义的Mat对象,卷积核或者算子。

    -参数Point表示锚定的位置,Point(-1, -1)表示默认为卷积核中心位置。

    -参数delta表示卷积处理之后的每个像素值是否加上常量delta,默认0.0表示不加上额外值到处理后的像素值上。

    -参数borderType表示边缘像素的处理方式,默认为BORDER_DEFAULT。

    通过定义不同的卷积核、filter2D函数可以实现卷积的各种功能、包括模糊、锐化、边缘提取等。下面我们就来一一通过代码演示

    实现模糊-代码演示

    #include<opencv2/opencv.hpp>
    #include<iostream>
    int main(){
    cv::Mat m1 = cv::imread("D:/640.jpg",4);
    cv::Mat m2;
    cv::namedWindow("windows",CV_WINDOW_AUTOSIZE);
    cv::imshow("windows",m1);
    int ksize = 15;
    cv::Mat kernel = cv::Mat::ones(ksize, ksize, CV_32F) / (float)(ksize*ksize);//ones函数很像MATLAB里的语句吧。这句的意思是先定义一个15×15的32bit浮点数矩阵,元素全为1,所有元素再除以225。
    cv::filter2D(m1,m2,-1,kernel,cv::Point(-1,-1),0.0,4);
    cv::bilateralFilter(m1,m2,15,120,10,4);
    cv::namedWindow("windows1", CV_WINDOW_AUTOSIZE);
    cv::imshow("windows1", m2);
    cv::waitKey(0);
    return 0;
    }

    实现边缘提取-代码演示

    #include<opencv2/opencv.hpp>
    #include<iostream>
    int main(){
    cv::Mat m1 = cv::imread("D:/640.jpg",4);
    cv::Mat m2;
    cv::namedWindow("windows",CV_WINDOW_AUTOSIZE);
    cv::imshow("windows",m1);
    int ksize = 15;
    cv::Mat kernel =( cv::Mat_<char>(3,3)<<-1,-1,-1,-1,8,-1,-1,-1,-1);
    cv::filter2D(m1,m2,-1,kernel,cv::Point(-1,-1),0.0,4);
    cv::bilateralFilter(m1,m2,15,120,10,4);
    cv::namedWindow("windows1", CV_WINDOW_AUTOSIZE);
    cv::imshow("windows1", m2);
    cv::waitKey(0);
    return 0;
    }

     

    实现锐化-代码演示

    #include<opencv2/opencv.hpp>
    #include<iostream>
    int main(){
    cv::Mat m1 = cv::imread("D:/640.jpg",4);
    cv::Mat m2;
    cv::namedWindow("windows",CV_WINDOW_AUTOSIZE);
    cv::imshow("windows",m1);
    int ksize = 15;
    cv::Mat kernel =( cv::Mat_<char>(3,3)<<-1,-1,-1,-1,9,-1,-1,-1,-1);
    cv::filter2D(m1,m2,-1,kernel,cv::Point(-1,-1),0.0,4);

    cv::namedWindow("windows1", CV_WINDOW_AUTOSIZE);
    cv::imshow("windows1", m2);
    cv::waitKey(0);
    return 0;
    }

    Robot算子效果-代码演示

    #include<opencv2/opencv.hpp>
    #include<iostream>
    int main(){
    cv::Mat m1 = cv::imread("D:/640.jpg",4);
    cv::Mat m2;
    cv::namedWindow("windows",CV_WINDOW_AUTOSIZE);
    cv::imshow("windows",m1);
    int ksize = 15;
    cv::Mat kernel =( cv::Mat_<char>(2,2)<<-1,0,0,1);
    cv::filter2D(m1,m2,-1,kernel,cv::Point(-1,-1),0.0,4);

    cv::namedWindow("windows1", CV_WINDOW_AUTOSIZE);
    cv::imshow("windows1", m2);
    cv::waitKey(0);
    return 0;
    }

    Sobel算子效果-代码

    #include<opencv2/opencv.hpp>
    #include<iostream>
    int main(){
    cv::Mat m1 = cv::imread("D:/1.jpg",4);
    cv::Mat m2;
    cv::namedWindow("windows",CV_WINDOW_AUTOSIZE);
    cv::imshow("windows",m1);
    int ksize = 15;
    cv::Mat kernel =( cv::Mat_<char>(3,3)<<1,2,1,0,0,0,-1,-2,-1);
    cv::filter2D(m1,m2,-1,kernel,cv::Point(-1,-1),0.0,4);

    cv::namedWindow("windows1", CV_WINDOW_AUTOSIZE);
    cv::imshow("windows1", m2);
    cv::waitKey(0);
    return 0;
    }

     

    应用场景:

    filter2D是OpenCV中相当灵活的滤波函数、灵活使用可以适合多个不同应用场景,实现多种功能包括模糊、锐化、边缘提取、图像增强等等。

    总结:

    OpenCV中为我们提供上述常见5种滤波函数,熟练掌握这五种滤波方法与应用场景是学以致用的关键。

  • 相关阅读:
    利用后退按钮进行重复提交的解决办法。
    运用上传拦截器时遇到的一个问题
    Fckeditor上传图片的错误
    关于分页的一些经验。
    spring在web工程中的运用
    引入js失败的可能原因
    hql执行update行为时可能遇到的一个问题。
    Eclipse下freemarker插件的安装
    同名文本框与同名复选框在传值上的不同.
    spring在java工程中的运用
  • 原文地址:https://www.cnblogs.com/invisible2/p/10383008.html
Copyright © 2020-2023  润新知