图像噪声
图像噪声反应到图像上就是图像的亮度与颜色呈现某种程度的不一致性。其产生的原因很复杂,有的可能是数字信号在传输过程中发生了丢失或者受到干扰,有的是成像设备或者环境本身导致成像质量不稳定。
从噪声的类型上,常见的图像噪声可以分为如下几种:
- 椒盐噪声(脉冲噪声)
- 高斯噪声/符合高斯分布
- 均匀分布噪声
椒盐噪声 也称为 脉冲噪声 ,是 图像 中经常见到的一种 噪声 ,它是一种随机出现的白点或者黑点,可能是亮的区域有黑色像素或是在暗的区域有白色像素(或是两者皆有)。
高斯噪声是指它的概率密度函数服从高斯分布(即正态分布)的一类噪声。
与椒盐噪声相似(Salt And Pepper Noise),高斯噪声(gauss noise)也是数字图像的一个常见噪声。椒盐噪声是出现在随机位置、噪点深度基本固定的噪声,高斯噪声与其相反,是几乎每个点上都出现噪声、噪点深度随机的噪声。
均匀分布噪声是指它的概率密度函数服从均匀分布的一类噪声。均匀分布是概率统计中的重要分布之一。顾名思义,均匀,表示可能性相等的含义。
模糊原理
Smooth/Blur是图像处理中最简单和常用的操作之一
使用该操作的原因之一就是为了给图像预处理时减低噪声
使用Smooth/Blur操作背后是数学的卷积计算
通常这些卷积算子计算都是线性操作,所以又叫线性滤波。
对比与处理之前的各个点的像素值,模糊处理后的像素值更加的平滑,对于噪声有很好的减低效果。(噪音的意思是像素值突然出现的失真,在某个或某些像素点像素值不正常地大或小,而模糊操作是减少这种现象)
opencv的API
归一化盒子滤波(一种均值滤波)
当α的值为true时,得到的结果和均值滤波相同
当α的值为false时,得到的结果不取平均值,但是很容易发生溢出,当得到的值大于255时,就取255。
API为:
blur(Mat src, Mat dst, Size(xradius,yradius), Point(-1,-1));
高斯滤波
API为:
GaussianBlur(Mat src, Mat dst, Size(11,11),sigmax,sigmay);//其中Size(x,y),x,y必须为正奇数
src:输入图像,即源图像,填Mat类的对象即可。它可以是单独的任意通道数的图片,但需要注意,图片深度应该为CV_8U,CV_16U, CV_16S, CV_32F 以及 CV_64F之一。
dst:目标图像,需要和源图片有一样的尺寸和类型。比如可以用Mat::Clone,以源图片为模板,来初始化得到如假包换的目标图。
ksize:高斯内核的大小。其中ksize.width和ksize.height可以不同,但他们都必须为正奇数(这是因为我们需要找到卷积核的中心,如果是偶数,那么找不到卷积核核心);或者,它们可以是零的,它们都是由sigma计算而来。
sigmaX:高斯核函数在X方向的的标准偏差。
sigmaY:高斯核函数在Y方向的的标准偏差。若sigmaY为零,就将它设为sigmaX,如果sigmaX和sigmaY都是0,那么就由ksize.width和ksize.height计算出来。
代码实例
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
std::cout << "Hello World!\n";
Mat src, dst;
src = imread("A:/opencvproject/001.jpg");
if (!src.data)
{
cout << "img not ex";
return -1;
}
char input_win[] = "input_window";
char output_win[] = "output_window";
namedWindow(input_win, CV_WINDOW_AUTOSIZE);
namedWindow(input_win, CV_WINDOW_AUTOSIZE);
imshow(input_win, src);
blur(src, dst, Size(3, 3), Point(-1, -1));
imshow(output_win, dst);
waitKey(0);
return 0;
}
运行结果为:
我们试着改变卷积核的大小:
blur(src, dst, Size(5, 5), Point(-3, -3));
发现图片变得更加模糊,像素值会更加的平滑。
我们改变卷积核为:
blur(src, dst, Size(29, 1), Point(-1, -1));
我们发现图像产生了x方向上的模糊。
再次改变卷积核为:
blur(src, dst, Size(1, 29), Point(-1, -1));
这时的图像产生了y方向上的模糊。
我们使用高斯模糊试一试:
添加代码:
Mat gblur;
namedWindow("gblur_win", CV_WINDOW_AUTOSIZE);
GaussianBlur(src, gblur, Size(9, 9), 11, 11);
imshow("gblur_win", gblur);
然后我们改变blur的卷积核也为9×9:
blur(src, dst, Size(9, 9), Point(-1, -1));
此时得到两个模糊处理后的图像,对比发现,高斯模糊的图像显得更加清晰一点,这是因为高斯模糊是基于权重的,而均值模糊完全是平均得到的。