•对自备图片利用二维高斯模板,对其进行加权平滑滤波,并比较其效果
•高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程
高斯小狮子
程序如下:
//得到高斯小狮子噪声色色 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为真构造高斯随机变量X z0 = sqrt(-2.0*log(u1))*cos(2 * CV_PI * u2); z1 = sqrt(-2.0*log(u1))*sin(2 * CV_PI * u2); return z1 * 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("1.jpg"); namedWindow("均鞭图", 1); imshow("均鞭图", srcImage); /*********************对图像添加高斯噪声并进行高斯滤波**************/ Mat GaussianshowImage,GaussianshowImage_1; GaussianshowImage_1 = addGaussianNoise(srcImage); imshow("高斯噪声小狮子的色图", GaussianshowImage_1); GaussianBlur(GaussianshowImage_1, GaussianshowImage, Size(3, 3), 1); imshow("高斯滤波小狮子的色图", GaussianshowImage); }
程序例程如上,可自行shiy