使用 Matplotlib(规范)或均衡直方图

(Norm)ing or equalising a historgram with Matplotlib

我有个小favour/question要请教! 我有大约 25 张这样的图片:

而且尺寸始终相同。我正在尝试计算图像中黑白的数量 space。

但在某些情况下,它会上升到 4 个,而在某些情况下,当然会更少! 但我很乐意对其进行规范化,以便 z 轴始终上升到固定数字。 我在这里找到了一些方法:Plot a histogram such that the total area of the histogram equals 1 (density) 但是找不到我正在寻找的解决方案。 我试过 seaboard,改变比例等等。 代码:

np.array(pic_b) #letter Picture
pixels_b = np.array(pic_b).flatten()
pixels_b
fig, ax = plt.subplots(figsize=(6, 8) )


plt.hist(pixels_b,3, density=True)

# df = sns.load_dataset('penguins') #example data of course 
# fig, ax = plt.subplots(figsize=(5, 6))
# p = sns.histplot(data=df, x='flipper_length_mm', stat='density', ax=ax)


plt.show()

有什么建议吗? 非常感谢,我知道我不是很好!

您可以使用 np.histogram 来计算直方图值。然后将结果数组除以它的最大值。 ax.bar(...) 可以显示直方图,使用 bin 边界来定位条形:

import matplotlib.pyplot as plt
import numpy as np

# first generate some test data
pixels_a = np.random.choice([0, 255], 1000000, p=[0.11, 0.89])
pixels_b = np.random.choice([0, 255], 1000000, p=[0.19, 0.81])
pixels_c = np.random.choice([0, 255], 1000000, p=[0.03, 0.97])

fig, axs = plt.subplots(ncols=3, figsize=(12, 4))
for data, ax in zip([pixels_a, pixels_b, pixels_c], axs):
    values, bin_bounds = np.histogram(data, bins=3)
    values = values / values.max()
    ax.bar(bin_bounds[:-1], values, width=bin_bounds[1] - bin_bounds[0], align='edge')
plt.tight_layout()
plt.show()