opencv-9-图像噪声以及评估指标 PSNR 与SSIM

本文介绍了图像降噪的基础理论,包括噪声产生、模型及常见类型。通过opencv,探讨了如何添加噪声、量化方法,并详细阐述了计算PSNR和SSIM的原理。提供了椒盐噪声和高斯噪声的测试案例,展示了这两个关键评估指标在图像质量退化时的变化。
摘要由CSDN通过智能技术生成

开始之前

我们在将 opencv 的图像显示在了 qt 的label 上, 我们能够将图显示在label 上, 用于显示我们的算法,
我们在 opencv 上一篇文章中介绍了 opencv 的核操作, 我们这里就要进入一个很重要的章节了,图像滤波操作, 也是图像核操作应用的一个很重要的章节,

那我们就从降噪的角度完整的讲一下, 并通过 opencv 核的方式进行图像算法操作, 【技术综述】一文道尽传统图像降噪方法 这篇文章写的还算比较完整, 也是传统的算法的一个综述过程,

目录

前言

数字成像过程中由于电噪声以及其他因素, 导致我们获取到的图像存在噪声,噪声出现在输入部分, 在后续的每个步骤都会受到影响, 所以在数字图像处理的前面必须要进行的一个步骤就是 图像降噪

每个做信号处理的都会接触到一类问题 , 信号降噪, 让人最头疼的一门课,真是感谢老师给过, 但是后面自己用到的时候反而感觉真的好用, 原来是这样, 然后就慢慢学会了怎么使用吧…(感觉还是弱鸡)
知乎可复现的图像降噪算法总结这篇文章列出了一个能够复现的图像降噪操作算法列表, 近年来实现了的算法可以见reproducible-image-denoising-state-of-the-art, 之后使用相应的文章进行算法实现吧.( 又立了一个 flag )

图像降噪理论基础

图像降噪主要的目的是在进行去除图像噪声的同时保留尽可能多的主要特征, 对于人眼来说, 区分噪声还算比较容易, 但是对于计算机来说,输入的都是数据, 我怎么区分哪个是噪声, 哪个不是噪声呢, 这里就要引入噪声的理论基础了

图像噪声的产生

我们在之前的章节介绍了图像的程序系统, 实际上在成像过程中可能由于点噪声, 量化过程等造成噪声,
实际上的噪声主要分为三种:

  1. 加性噪声: 与输入无关, f ( x , y ) = g ( x , y ) + n ( x , y ) f(x,y) = g(x,y) +n(x,y) f(x,y)=g(x,y)+n(x,y)
  2. 乘性噪声: 与输入信号有关, f ( x , y ) = g ( x , y ) + n ( x , y ) ⋅ g ( x , y ) f(x,y) = g(x,y) + n(x,y) \cdot g(x,y) f(x,y)=g(x,y)+n(x,y)g(x,y)
  3. 量化噪声: 与输入无关, 在图像量化过程噪声的量化误差导致的噪声,

实际上后两种很难解决, 目前处理的都是以 加性噪声为主, 属于随机的噪声信号, 根据统计学的观点, 噪声在无限长时间窗内的噪声和为0, 在第一类中的 n ( x , y ) n(x,y) n(x,y) 随着时间存在正负信号的不确定变化.

噪声零和特点

上图所示虚线代表真实信号,红蓝线表示的就是随机噪声信号,所有的随机噪声信号求和后结果为0。

这里关于噪声的说明可以参考图像去噪算法简介

噪声在理论上可以定义为“不可预测,只能用概率统计方法来认识的随机误差”。因此将图像噪声看成是多维随机过程是合适的,因而描述噪声的方法完全可以借用随机过程的描述,即用其概率分布函数和概率密度分布函数。但在很多情况下,这样的描述方法是很复杂的,甚至是不可能的。而实际应用往往也不必要。通常是用其数字特征,即均值方差,相关函数等。因为这些数字特征都可以从某些方面反映出噪声的特征。

我认为图像噪声的成因分类与常见图像去噪算法简介这篇文章关于噪声的分类部分讲的还比较细, 可以参考

图像噪声的模型

由于我们认为噪声在时间尺度的随机性, 但是我们可以使用噪声的概率分布与概率密度函数进行描述, 那么我们就能将噪声根据其分布特点进行分类,
我们稍微介绍一下常见的噪声模型吧

一些重要的噪声概率密度函数

噪声模型主要可以分为:

  • 高斯噪声,高斯噪声模型经常被用于实践中。
  • 脉冲噪声(椒盐噪声),图像上一个个点,也可称为散粒和尖峰噪声。
  • 伽马噪声
  • 瑞利噪声
  • 指数分布噪声
  • 均匀分布噪声

这里能查到的资料很多, 可以看我们的参考部分, 内容都一样, 再写只是浪费时间和精力, 有兴趣的可以自己翻阅

图像降噪操作

其实吧, 我就不应该讲那么多, 直接开始图像处理部分就行了, 为了开始进行图像处理, 我们要先进行一点小工作, 我们要按造以下步骤进行降噪算法的比较,

  1. 选择标准图像— lena.png
  2. 添加噪声
  3. 量化噪声
  4. 降噪操作
  5. 量化结果值
  6. 比较结果

在我们进行算法比对之前, 我们选择的是 lena 的图像, 加入随机噪声, 然后计算出来 一个噪声的比例, 进行降噪操作, 再次计算以下噪声参数, 看下效果值.

如果是进行算法比较的时候, 最好选择现有的降噪的数据集进行比较, 比如, Kodak , BSD

噪声添加

我们认为噪声是随机的, 我们生成随机数加在原始图像上便能够得到噪声图像, opencv 没有提供相应的实现, 但是知道原理了, 写起来都比较简单, 我比较喜欢
图像处理基础(1):噪声的添加和过滤 使用的方法, 他使用的是 梅森旋转算法 来实现的伪随机算法,

其实吧这里我也不懂, 但是随机数能用就行了, 我又不是数学家, 然后看到了 谈谈梅森旋转:算法及其爆破

这里就不重复造轮子了, 直接复制他给出的代码就好,

// 添加椒盐噪声 // 生成 随机 num 个 白点
void addSaltNoise(Mat &m, int num)
{
   
	// 随机数产生器
	std::random_device rd; //种子
	std::mt19937 gen(rd()); // 随机数引擎

	auto cols = m.cols * m.channels();

	for (int i = 0; i < num; i++)
	{
   
		auto row = static_cast<int>(gen() % m.rows);
		auto col = static_cast<int>(gen() % cols);

		auto p = m.ptr<uchar>(row);
		p[col++] = 255;
		p[col++] = 255;
		p[col] = 255;
	}
}

// 添加Gussia噪声
// 使用指针访问
void addGaussianNoise(Mat &m, int mu, int sigma)
{
   
	// 产生高斯分布随机数发生器
	std::random_device rd;
	std::mt19937 gen(rd());

	std::normal_distribution<> d(mu, sigma);

	auto rows = m.rows; // 行数
	auto cols = m.cols * m.channels(); // 列数

	for (int i = 0; i < rows; i++)
	{
   
		auto p = m.ptr<uchar>(i); // 取得行首指针
		for (int j = 0; j < cols; j++)
		{
   
			auto tmp = p[j] + d(gen);
			tmp = tmp > 255 ? 255 : tmp;
			tmp = tmp < 0 ? 0 : tmp;
			p[j] = tmp;
		}
	}
}

噪声量化方法

这里其实涉及到图像质量评估的领域,可以参考图像质量评价概述(评估指标、传统检测方法)介绍的方法, 存在太多的计算方式,

我们必须选择一个量化噪声的方式进行图像质量的评估, 一般进行噪声评估手段就是噪声比(Signal to Noise Ratio,SNR),峰值信噪比(Peak Signal to Noise Ratio, PSNR) , 均方差值(Mean Square Error, MSE), 结构相似性(Structural SIMilarity, SSIM),

我们一个一个来看, 均方差值是用于比较两幅图像 K, I 的均方差值
M S E = 1 m n ∑ i = 0 n − 1 ∑ j = 0 m − 1 ∥ K ( i , j ) − I ( i , j ) ∥ 2 MSE=\frac{1}{mn}\sum_{i=0}^{n-1}\sum_{j=0}^{m-1}\parallel K(i,j)-I(i,j)\parallel^{2} MSE=mn1i=0n1j=0m1K(i,j)I(i,j)2

峰值信噪比PSNR衡量图像失真或是噪声水平的客观标准。2个图像之间PSNR值越大,则越相似。普遍基准为30dB,30dB以下的图像劣化较为明显。定义为,
P S N R = 10 l o g 10 ( M A X 2 M S E ) PSNR=10log_{10}(\frac{MAX^{2}}{MSE}) PSNR=10log10(

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值