椒盐噪声是椒噪声和盐噪声的合称,它是由图像传感器,传输信道,解码处理等产生的黑白相间的亮暗点噪声,去除椒盐噪声的最常用算法是中值滤波,在去除椒盐噪声的效果上均值滤波不如中值滤波,本文所给的代码会证明这个结论。
首先说下怎么给图像加上椒噪声和盐噪声。我们可以利用C++的srand函数和rand函数来产生随机坐标,并把这些坐标置为椒噪声点或盐噪声点。
这两个函数的用法就不多说了,大家可自行搜索下网上的资源,再结合代码大家很容易知道怎么用。值得一提的是rand函数的范围为0至RAND_MAX,是整数,RAND_MAX的值在stdlib.h中有定义,定义如下:
#define RAND_MAX 0x7fff
在本文的代码中,盐噪声的BGR值为(250,150,250),椒噪声的BGR值为(250,150,50)
再来说均值滤波和中值滤波。
均值滤波:它是用某点邻域窗口内的的所有像素的平均值来代替锚点处的值。它不能很好地保护图像细节,在图像去噪的同时也破坏了图像的细节部分,从而使图像变得模糊,不能很好地去除噪声点。
中值滤波:中值滤波法是一种非线性平滑技术,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值。
OpenCV提供了函数medianBlur和函数blur来实现均值滤波和中值滤波,这两个函数的使用方法简单,没必要作过多的说明,唯一需要说明白是这两个函数的第三个参数均需提供核算子的大小,关于“核算子”的概念,大家可参考博文https://blog.csdn.net/lehuoziyuan/article/details/84101788
代码如下:
图像处理开发资料、图像处理开发需求、图像处理接私活挣零花钱,可以搜索公众号"qxsf321",并关注!
代码中用到的图像下载链接:http://pan.baidu.com/s/1kUI2NAn 密码:nu5t
//opencv版本:OpenCV3.0
//VS版本:VS2013
//Author:qxsf321.net
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/imgproc/types_c.h>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/highgui/highgui_c.h>
#include <time.h>
#include <iostream>
using namespace cv;
using namespace std;
void ColorSalt(Mat& image, int n)//本函数加入彩色盐噪声
{
srand((unsigned)time(NULL));
for (int k = 0; k<n; k++)//将图像中n个像素随机置零
{
int i = rand() % image.cols;
int j = rand() % image.rows; RAND_MAX
//将图像颜色随机改变
image.at<Vec3b>(j, i)[0] = 250;
image.at<Vec3b>(j, i)[1] = 150;
image.at<Vec3b>(j, i)[2] = 250;
}
}
void ColorPepper(Mat& image, int n)//本函数加入彩色椒噪声
{
srand((unsigned)time(NULL));
for (int k = 0; k<n; k++)
{
int i = rand() % image.cols;
int j = rand() % image.rows;
//将图像颜色随机改变
image.at<Vec3b>(j, i)[0] = 250;
image.at<Vec3b>(j, i)[1] = 150;
image.at<Vec3b>(j, i)[2] = 50;
}
}
int main()
{
//源图像
Mat scr = imread("qiu_ye.jpg");
Mat dst;
Mat img = scr.clone();
Mat img1 = scr.clone();
cout << scr.channels() << " " << scr.type() << " " << scr.depth();
imshow("原图像", scr);
ColorSalt(scr, 5000); //加入白盐噪声
ColorPepper(scr, 1000); //加入黑椒噪声
imshow("带噪声的图像", scr);
medianBlur(scr, dst, 3); //中值滤波,核算子大小为3,锚点为默认的中间点
imshow("中值滤波结果", dst);
ColorSalt(img, 5000);
ColorPepper(img, 1000);
blur(img, dst, Size(3, 3));//均值滤波,核算子大小为3,锚点为默认的中间点
imshow("均值滤波结果", dst);
waitKey(0);
return EXIT_SUCCESS;
}
运行结果截图如下:
从截图中我们可以看出,对于椒盐噪声,中值滤波的效果优于均值滤波。