代码列出了高斯滤波、中值滤波、均值滤波和双边滤波:
#include <QCoreApplication> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <iostream> using namespace cv; using namespace std; int main() { double duration; Mat src = imread("lena.jpg", 1); Mat dst; namedWindow("src", 0); imshow("src", src); //高斯滤波,src:输入图像,dst:输出图像 //Size(5,5)模板大小,为奇数,x方向方差,Y方向方差 duration = static_cast<double>(getTickCount()); GaussianBlur(src,dst,Size(31,31),0,0); duration = static_cast<double>(getTickCount()) - duration; duration /= getTickFrequency(); cout << duration << endl; namedWindow("Gaussi", 0); imshow("Gaussi", dst); //中值滤波,src:输入图像,dst::输出图像,模板宽度,为奇数 duration = static_cast<double>(getTickCount()); medianBlur(src,dst,31); duration = static_cast<double>(getTickCount()) - duration; duration /= getTickFrequency(); cout << duration << endl; namedWindow("Median", 0); imshow("Median", dst); //均值滤波,src:输入图像,dst:输出图像,模板大小 //Point(-1,-1):被平滑点位置,为负值取核中心 duration = static_cast<double>(getTickCount()); blur(src,dst,Size(31,31),Point(-1,-1)); duration = static_cast<double>(getTickCount()) - duration; duration /= getTickFrequency(); cout << duration << endl; namedWindow("Blur", 0); imshow("Blur", dst); //双边滤波,src:输入图像,dst:输入图像,滤波模板半径 //颜色空间标准差,坐标空间标准差 duration = static_cast<double>(getTickCount()); bilateralFilter(src,dst,31,62,31); duration = static_cast<double>(getTickCount()) - duration; duration /= getTickFrequency(); cout << duration << endl; namedWindow("Bilatera", 0); imshow("Bilatera", dst); waitKey(0); }
为了方便比对,统一采用31像素大小的滤波核,结果如下:
运行时间的结果如下:
通过比较滤波效果和运行时间,各种滤波算法的优缺点如下:
1、均值滤波:速度最快,且不会因为滤波核的增大而增加运行时间,由于均值滤波的特殊运算方式让他可以使用数组保存的向量计算方法使其运算性能与核大小无关,具体算法可以查看另一篇博文点击打开链接,缺点是降噪之后也会降低一些边缘和细节特征的强度,且对与椒盐噪声无能为力。
2、高斯滤波:速度相对于均值滤波略慢,并且不能使运行速度与滤波核的大小无关,对于服从正态分布的噪声有很好的降噪效果。
3、中值滤波:运算速度比较慢,且在相同滤波核增长速度的前提下,运行时间的增长速度比高斯滤波算法的增长速度大的多,但是对于椒盐噪声有很好的滤波效果。
4、双边带滤波:运行速度最慢,且在相同滤波核增长速度的前提下,运行时间比中值滤波算法增长速度还要大,但是双边带滤波算法的降噪效果的很好的,因为它除了完成降噪功能之外还能很好的保留图像中的边缘信息。
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-10 21:04:20