基于直方图的图像噪声估计

时间:2019-07-21 12:20:14

标签: python image-processing noise

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

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

我想知道是否有一种方法可以检测噪声模型,然后根据图像直方图估算噪声水平(基于特定的噪声模型,例如针对高斯的std)?喜欢识别密度函数吗?或者也许此任务需要以空间域以外的其他形式输入,例如需要转换图像然后执行任务。

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

编辑:为了清晰起见,我知道您可以通过查看直方图来检测噪声。我正在寻找一种不会自己“视觉上”执行此操作的方法。我想检测噪声,也许还要检测密度函数,然后再执行高斯或泊松或...的操作。

如果有人能提供解决此问题的正确方法的提示,我将不胜感激。

1 个答案:

答案 0 :(得分:0)

通常来说,不可能通过分析直方图来确定噪声分布。因为,很难确定变化是由于图像纹理和照明变化还是噪声引起的。这是海滩沙子的原始和嘈杂图像(高斯噪声)的直方图示例:

comparison of histogram of noisy and unnoisy images

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

  

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

用于估计图像噪声的最简单技术是找到图像的最平滑部分,找到该部分的直方图,然后根据该部分估计整个图像的噪声分布。这是使用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()

和结果:

Estimated Noise