opencv学习笔记(九)-- 图像模糊去噪(均值滤波和高斯滤波)

本文介绍了图像噪声的类型,包括椒盐噪声、高斯噪声和均匀分布噪声,并探讨了图像模糊处理的作用。通过OpenCV的API,详细讲解了归一化盒子滤波(均值滤波)和高斯滤波的实现,包括不同卷积核大小对图像效果的影响。最后,通过代码实例展示了如何应用这两种滤波方法,对比了它们在图像平滑和噪声降低方面的效果。
摘要由CSDN通过智能技术生成

图像噪声

图像噪声反应到图像上就是图像的亮度与颜色呈现某种程度的不一致性。其产生的原因很复杂,有的可能是数字信号在传输过程中发生了丢失或者受到干扰,有的是成像设备或者环境本身导致成像质量不稳定。
从噪声的类型上,常见的图像噪声可以分为如下几种:

  • 椒盐噪声(脉冲噪声)
  • 高斯噪声/符合高斯分布
  • 均匀分布噪声

椒盐噪声 也称为 脉冲噪声 ,是 图像 中经常见到的一种 噪声 ,它是一种随机出现的白点或者黑点,可能是亮的区域有黑色像素或是在暗的区域有白色像素(或是两者皆有)。

高斯噪声是指它的概率密度函数服从高斯分布(即正态分布)的一类噪声。
与椒盐噪声相似(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));

在这里插入图片描述
此时得到两个模糊处理后的图像,对比发现,高斯模糊的图像显得更加清晰一点,这是因为高斯模糊是基于权重的,而均值模糊完全是平均得到的。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值