我想缩放具有正态分布的numpy数组中的显示数据。
Tutorial here建议使用clim,但在示例中,限制被硬编码为clim=(0.0, 0.7)。从教程中的先前直方图获取这些值:

python - 适用于正态分布2D numpy数组数据的Python imshow scale-LMLPHP

因此,我需要一种漂亮的方式来获取clim值(无需进行硬编码),也许可以使用标准偏差(1 sigma,2 sigma,3 sigma)来获取主要值:

python - 适用于正态分布2D numpy数组数据的Python imshow scale-LMLPHP

我该怎么做?

最佳答案

要获得正态分布,可以使用scipy.optimize.curve_fit将高斯函数拟合到直方图。按照读取图像并获取直方图的步骤,以下是如何拟合直方图的方法:

import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import numpy as np
from scipy.optimize import curve_fit

# Read image
img=mpimg.imread('stinkbug.png')

# Get histogram
hist,bins,_ = plt.hist(img.ravel(), bins=256, range=(0.0, 1.0), fc='k', ec='k')

# Get centers of histogram bins
bin_centers = np.mean([bins[:-1],bins[1:]], axis=0)

# Define the Gaussian function
def gaussian(x, mu, sigma, amp):
    return amp*np.exp( -(x - mu)**2 / (2.*sigma**2))

# Curve fit
p_opt,_ = curve_fit(gaussian, bin_centers, hist)

# Get the fit parameters
mu, sigma, amp = p_opt


您可以查看拟合:

fit = gaussian(bin_centers, mu, sigma, amp)
plt.plot(bin_centers, hist)
plt.plot(bin_centers, fit)


python - 适用于正态分布2D numpy数组数据的Python imshow scale-LMLPHP

然后,可以将拟合参数用于clim。首先,这是原始图片:

plt.imshow(img)


python - 适用于正态分布2D numpy数组数据的Python imshow scale-LMLPHP

这是将像素颜色限制在3σ之内:

plt.imshow(img, clim=(mu-3*sigma, mu+3*sigma))


python - 适用于正态分布2D numpy数组数据的Python imshow scale-LMLPHP

关于python - 适用于正态分布2D numpy数组数据的Python imshow scale,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53560923/

10-09 12:28