我想估计输入图像的噪声水平。
我制作了一些嘈杂的图像和原始图像的直方图,并将它们进行比较,然后通过查看图像两个不同阶段中的直方图,可以看出哪一个是有噪声的以及出现了哪种类型的噪声。 (说噪声,是指常见的噪声类型,例如高斯噪声,泊松噪声,斑点噪声等)
我想知道是否有一种方法可以检测噪声模型,然后根据图像直方图估算噪声水平(基于特定的噪声模型,例如针对高斯的std)?喜欢识别密度函数吗?或可能需要以空间域以外的其他形式输入任务,例如需要转换图像然后执行任务。
我使用的像素值变化非常小(例如渐变)的图像,然后我自己应用噪点来比较无噪和噪点图像的直方图。
编辑:为了清除,我知道您可以基于直方图来检测噪声。我正在寻找一种不会自己“视觉上”执行此操作的方法。我想检测噪声,也许还要检测密度函数,然后执行高斯或泊松或...的操作。
如果有人可以提供解决此问题的正确方法的提示,我将不胜感激。
最佳答案
一般来说,不可能通过分析直方图来确定噪声分布。因为,很难确定变化是由于图像纹理和光照变化还是噪声引起的。这是海滩沙子原始图像和嘈杂图像(高斯噪声)的直方图示例:
由于图像方差很大,并且本身具有高斯分布,因此噪声的确会稍微改变直方图。请注意,我们没有现实世界中的原始图像用于比较。
对于您的情况,如前所述,原始图像是平滑的,因此图像的方差很小。任何噪声都会大大增加方差,这在直方图中很明显。
所以对于问题的基本部分,
我想估计输入图像的噪声水平。
用于估计图像噪声的最简单技术是找到图像的最平滑部分,找到该部分的直方图,然后根据该部分估计整个图像的噪声分布。这是使用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()
结果:
关于python - 基于直方图的图像噪声估计,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57133157/