为了账号安全,请及时绑定邮箱和手机立即绑定

如何创建 uint16 高斯噪声图像?

如何创建 uint16 高斯噪声图像?

MM们 2021-11-02 19:59:08
我想创建一个具有定义的均值和标准差的高斯噪声的uint16图像。我试过random.normal为此使用 numpy ,但它返回一个 float64 数组:mu = 10sigma = 100shape = (1024,1024)gauss_img = np.random.normal(mu, sigma, shape)print(gauss_img.dtype)>>> dtype('float64')有没有办法在保留原始均值和标准差的同时转换gauss_img为 uint16 数组?或者是否有另一种完全创建 uint16 噪声图像的方法?编辑:正如评论中提到的,在np.random.normal给定 sd > 均值的情况下,不可避免地会采样负值,这是转换为 uint16 的问题。所以我想我需要一种不同的方法来直接创建一个无符号的高斯图像。
查看完整描述

3 回答

?
白板的微信

TA贡献1883条经验 获得超3个赞

所以我认为这与您正在寻找的很接近。


导入库并欺骗一些倾斜的数据。在这里,由于输入的来源未知,我使用np.expm1(np.random.normal()). 您也可以使用skewnorm().rvs(),但这有点作弊,因为这也是您用来表征它的库。


我将原始样本展平,以便更轻松地绘制直方图。


import numpy as np

from scipy.stats import skewnorm


# generate dummy raw starting data

# smaller shape just for simplicity

shape = (100, 100)

raw_skewed = np.maximum(0.0, np.expm1(np.random.normal(2, 0.75, shape))).astype('uint16')


# flatten to look at histograms and compare distributions

raw_skewed = raw_skewed.reshape((-1))

现在找到表征倾斜数据的参数,并使用这些参数创建一个新的分布以从中采样,希望能很好地匹配您的原始数据。


这两行代码确实是我所追求的。


# find params

a, loc, scale = skewnorm.fit(raw_skewed)


# mimick orig distribution with skewnorm

new_samples = skewnorm(a, loc, scale).rvs(10000).astype('uint16')

现在绘制每个的分布进行比较。


plt.hist(raw_skewed, bins=np.linspace(0, 60, 30), hatch='\\', label='raw skewed')

plt.hist(new_samples, bins=np.linspace(0, 60, 30), alpha=0.65, color='green', label='mimic skewed dist')

plt.legend()

//img1.sycdn.imooc.com//6181283d000195c007800538.jpg

直方图非常接近。如果这看起来足够好,请将您的新数据重塑为所需的形状。


# final result

new_samples.reshape(shape)

现在......这就是我认为它可能不足的地方。看看每个人的热图。原始分布的右侧有更长的尾部(更多skewnorm()未表征的异常值)。


这绘制了每个的热图。


# plot heatmaps of each

fig = plt.figure(2, figsize=(18,9))

ax1 = fig.add_subplot(1, 2, 1)

ax2 = fig.add_subplot(1, 2, 2)


im1 = ax1.imshow(raw_skewed.reshape(shape), vmin=0, vmax=120)

ax1.set_title("raw data - mean: {:3.2f}, std dev: {:3.2f}".format(np.mean(raw_skewed), np.std(raw_skewed)), fontsize=20)


im2 = ax2.imshow(new_samples.reshape(shape), vmin=0, vmax=120)

ax2.set_title("mimicked data - mean: {:3.2f}, std dev: {:3.2f}".format(np.mean(new_samples), np.std(new_samples)), fontsize=20)


plt.tight_layout()


# add colorbar

fig.subplots_adjust(right=0.85)

cbar_ax = fig.add_axes([0.88, 0.1, 0.08, 0.8])  # [left, bottom, width, height]

fig.colorbar(im1, cax=cbar_ax)

看着它……你会偶尔看到黄色斑点,表明原始分布中的值非常高,但没有进入输出。这也显示在输入数据的更高标准开发中(请参阅每个热图中的标题,但同样,如对原始问题的评论...... mean 和 std 并没有真正表征分布,因为它们不正常.. . 但它们是作为相对比较)。


但是......这只是我创建的非常具体的倾斜样本的问题。希望这里有足够的东西可以调整和调整,直到它适合您的需求和您的特定数据集。祝你好运!

//img1.sycdn.imooc.com//61812846000140c217860852.jpg

查看完整回答
反对 回复 2021-11-02
?
温温酱

TA贡献1752条经验 获得超4个赞

如果您有一系列 uint16 数字可供采样,那么您应该查看这篇文章

这样您就可以使用scipy.stats.truncnorm生成无符号整数的高斯。


查看完整回答
反对 回复 2021-11-02
?
德玛西亚99

TA贡献1770条经验 获得超3个赞

有了这个均值和西格玛,你一定会采样一些负值。所以我想这个选项可能是你在采样后找到最负的值,并将其绝对值添加到所有样本中。之后转换uint为评论中的建议。但是,当然,您会以这种方式失去平均值。


查看完整回答
反对 回复 2021-11-02
  • 3 回答
  • 0 关注
  • 183 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信