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

我想创建一个具有定义的均值和标准差的高斯噪声的uint16图像。


我试过random.normal为此使用 numpy ,但它返回一个 float64 数组:


mu = 10

sigma = 100

shape = (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 的问题。


所以我想我需要一种不同的方法来直接创建一个无符号的高斯图像。


MM们
浏览 195回答 3
3回答

白板的微信

所以我认为这与您正在寻找的很接近。导入库并欺骗一些倾斜的数据。在这里,由于输入的来源未知,我使用np.expm1(np.random.normal()). 您也可以使用skewnorm().rvs(),但这有点作弊,因为这也是您用来表征它的库。我将原始样本展平,以便更轻松地绘制直方图。import numpy as npfrom scipy.stats import skewnorm# generate dummy raw starting data# smaller shape just for simplicityshape = (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 distributionsraw_skewed = raw_skewed.reshape((-1))现在找到表征倾斜数据的参数,并使用这些参数创建一个新的分布以从中采样,希望能很好地匹配您的原始数据。这两行代码确实是我所追求的。# find paramsa, loc, scale = skewnorm.fit(raw_skewed)# mimick orig distribution with skewnormnew_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()直方图非常接近。如果这看起来足够好,请将您的新数据重塑为所需的形状。# final resultnew_samples.reshape(shape)现在......这就是我认为它可能不足的地方。看看每个人的热图。原始分布的右侧有更长的尾部(更多skewnorm()未表征的异常值)。这绘制了每个的热图。# plot heatmaps of eachfig = 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 colorbarfig.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 并没有真正表征分布,因为它们不正常.. . 但它们是作为相对比较)。但是......这只是我创建的非常具体的倾斜样本的问题。希望这里有足够的东西可以调整和调整,直到它适合您的需求和您的特定数据集。祝你好运!

温温酱

如果您有一系列 uint16 数字可供采样,那么您应该查看这篇文章。这样您就可以使用scipy.stats.truncnorm生成无符号整数的高斯。

德玛西亚99

有了这个均值和西格玛,你一定会采样一些负值。所以我想这个选项可能是你在采样后找到最负的值,并将其绝对值添加到所有样本中。之后转换uint为评论中的建议。但是,当然,您会以这种方式失去平均值。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python