OpenCV学习笔记(十)双边滤波

来源:互联网 发布:php一句话木马 编辑:程序博客网 时间:2024/06/08 16:48

双边滤波:

双边滤波是一种非线性的滤波方法,是结合图像的空间邻近度和像素值相似度的一种折中处理,同时考虑空域信息和灰度相似性,达到保留图像的同时削弱噪声的效果。

函数bilateralFilter(InputArray src , OutputArray dst, int d, double sigmaColor, double sigmaSpace, int borderType=BORDER_DEFAULT)

int 类型的d,表示在过滤过程中每个像素领域的直径。

double类型的sigmaColor,颜色空间滤波器的sigma值。这个值越大,表明该像素领域内有越宽广的颜色会被混合到一起。

double类型的sigmaSpace,坐标空间中滤波器的sigma值,坐标空间的标注方差,它的数值越大,意味着越远的像素会相互影响,从而使更大的区域中足够相似的颜色获得相同的颜色。

代码实现:

#include <opencv2/core/core.hpp>#include <opencv2/highgui/highgui.hpp>#include <opencv2/imgproc/imgproc.hpp>#include <cstdlib>#include <cmath>#include <limits>#include <iostream>using namespace cv;using namespace std;double generateGaussianNoise(double mu, double sigma){//定义一个特别小的值const double epsilon = numeric_limits<double>::min();//返回目标数据类型能表示的最逼近1的正数和1的差的绝对值static double z0, z1;static bool flag = false;flag = !flag;//flag为假,构造高斯随机变量if (!flag)return z1*sigma + mu;double u1, u2;//构造随机变量do{u1 = rand()*(1.0 / RAND_MAX);u2 = rand()*(1.0 / RAND_MAX);} while (u1 <= epsilon);//flag为真构造高斯随机变量Xz0 = sqrt(-2.0*log(u1))*cos(2 * CV_PI * u2);z1 = sqrt(-2.0*log(u1))*sin(2 * CV_PI * u2);return z0*sigma + mu;}Mat addGaussianNoise(Mat& srcImage){Mat resultImage = srcImage.clone();    //深拷贝,克隆int channels = resultImage.channels();    //获取图像的通道int nRows = resultImage.rows;    //图像的行数int nCols = resultImage.cols*channels;   //图像的总列数//判断图像的连续性if (resultImage.isContinuous())    //判断矩阵是否连续,若连续,我们相当于只需要遍历一个一维数组 {nCols *= nRows;nRows = 1;}for (int i = 0; i < nRows; i++){for (int j = 0; j < nCols; j++){//添加高斯噪声int val = resultImage.ptr<uchar>(i)[j] + generateGaussianNoise(2, 0.8) * 32;if (val < 0)val = 0;if (val > 255)val = 255;resultImage.ptr<uchar>(i)[j] = (uchar)val;}}return resultImage;}int main(){Mat srcImage = imread("D:\\1.jpg");if (srcImage.empty())return -1;Mat resultImage1 = addGaussianNoise(srcImage);Mat resultImage2;bilateralFilter(resultImage1, resultImage2, 25, 25 * 2, 25 / 2);imshow("srcImage", srcImage);imshow("resultImage1", resultImage1);imshow("resultImage2", resultImage2);waitKey(0);return 0;}






很明显的效果,对于高斯噪声,双边滤波比中值滤波的效果要好的多。。

1 0
原创粉丝点击