python - 基于直方图的图像噪声估计
问题描述
我想估计输入图像的噪声水平。
我制作了一些嘈杂和原始图像的直方图并进行了比较,通过查看图像的两个不同阶段的直方图,可以判断哪个是嘈杂的以及存在哪种类型的噪声。(我所说的噪声是指常见的噪声类型,如高斯、泊松、斑点等)
我想知道是否有一种方法可以检测噪声模型,然后从图像直方图中估计噪声水平(基于特定噪声模型,如高斯标准)?像识别密度函数?或者这个任务可能需要空间域以外的其他形式的输入,比如它需要转换图像然后可能执行任务。
我正在使用像素值变化非常小的图像,例如渐变,然后我自己应用噪声来比较无噪声和噪声图像的直方图。
编辑:为了清除,我知道您可以根据直方图检测噪声。我正在寻找一种我自己不会“在视觉上”这样做的方法。我想检测噪声和密度函数,然后如果它是高斯或泊松或......
如果有人可以就解决此问题的正确途径提供任何提示,我将不胜感激。
解决方案
一般来说,通过分析直方图是无法确定噪声分布的。因为,很难确定这些变化是由于图像纹理和照明变化,还是由于噪声。这是海滩沙子的原始和噪声图像(高斯噪声)的简单示例直方图:
由于图像方差相当大并且本身具有高斯分布,因此噪声确实会稍微改变直方图。请注意,我们没有现实世界中的原始图像进行比较。
对于您的情况,如上所述,原始图像是平滑的,因此图像的方差很低。任何噪声都会显着增加方差,这在直方图中很明显。所以对于问题的基本部分,
我想估计输入图像的噪声水平。
用于估计图像噪声的最简单技术是找到图像中最平滑的部分,找到该部分的直方图,并根据该部分估计整个图像的噪声分布。以下是使用 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 - 在 tkinter、Python 中使用 filedialog.askdirectory() 存储目录地址
- python - Selenium + Headless Chrome -- Cookie 不保存
- rtsp - 如何实现RTSP web-assembly模块
- java - 当尝试通过将 4 年添加到已建立的日期来创建新日期时,两个日期都会更改(GregorianCalendar)
- ios - 无法在运行 iOS 14.3 的 iPhone 上部署 iOS 应用程序
- java - java中的GUI组件如何居中放置?
- c# - 我如何检查我所有的跳棋是否都在同一个地方?
- api - Discord API node.js 悬停工具提示
- reactjs - 如果查询参数或路由参数发生变化,是否可以避免重新安装组件?
- reactjs - 如何设置反应材质ui选择组件高度的样式