首页 > 解决方案 > 基于直方图的图像噪声估计

问题描述

我想估计输入图像的噪声水平。

我制作了一些嘈杂和原始图像的直方图并进行了比较,通过查看图像的两个不同阶段的直方图,可以判断哪个是嘈杂的以及存在哪种类型的噪声。(我所说的噪声是指常见的噪声类型,如高斯、泊松、斑点等)

我想知道是否有一种方法可以检测噪声模型,然后从图像直方图中估计噪声水平(基于特定噪声模型,如高斯标准)?像识别密度函数?或者这个任务可能需要空间域以外的其他形式的输入,比如它需要转换图像然后可能执行任务。

我正在使用像素值变化非常小的图像,例如渐变,然后我自己应用噪声来比较无噪声和噪声图像的直方图。

编辑:为了清除,我知道您可以根据直方图检测噪声。我正在寻找一种我自己不会“在视觉上”这样做的方法。我想检测噪声和密度函数,然后如果它是高斯或泊松或......

如果有人可以就解决此问题的正确途径提供任何提示,我将不胜感激。

标签: pythonimage-processingnoise

解决方案


一般来说,通过分析直方图是无法确定噪声分布的。因为,很难确定这些变化是由于图像纹理和照明变化,还是由于噪声。这是海滩沙子的原始和噪声图像(高斯噪声)的简单示例直方图:

噪声和无噪声图像的直方图比较

由于图像方差相当大并且本身具有高斯分布,因此噪声确实会稍微改变直方图。请注意,我们没有现实世界中的原始图像进行比较。
对于您的情况,如上所述,原始图像是平滑的,因此图像的方差很低。任何噪声都会显着增加方差,这在直方图中很明显。所以对于问题的基本部分,

我想估计输入图像的噪声水平。

用于估计图像噪声的最简单技术是找到图像中最平滑的部分,找到该部分的直方图,并根据该部分估计整个图像的噪声分布。以下是使用 Opencv 进行噪声估计的示例:

import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread('cameraman.bmp',0)
row, col = img.shape
gauss = np.random.normal(10,10,(row,col))
noisy = img + gauss
smooth_part = noisy[:30, :30]

plt.subplot(221),plt.imshow(noisy,cmap = 'gray')
plt.title('Noisy Image'), plt.xticks([]), plt.yticks([])
plt.subplot(222),plt.imshow(smooth_part,cmap = 'gray')
plt.title('Smooth Part'), plt.xticks([]), plt.yticks([])
plt.subplot(223),plt.hist(noisy.ravel(),256,[0,256])#; plt.show()
plt.title('Noisy Image Histogram'), plt.xticks([]), plt.yticks([])
plt.subplot(224),plt.hist(smooth_part.ravel(),256,[0,256])#; plt.show()
plt.title('Estimated Noise Distribution'), plt.xticks([]), plt.yticks([])
plt.show()

结果:

估计噪声


推荐阅读