问题在python中绘制灰度图像的直方图

时间:2019-01-06 08:14:29

标签: image python-2.7 matplotlib histogram grayscale

我已经绘制了直方图

灰度图像

使用matplotlib。但是直方图看起来不像我想要的。

from matplotlib import pyplot as plt 
import numpy as np
from PIL import Image
im=Image.open("lena.pgm")
pxl=list(im.getdata())
print pxl
columnsize,rowsize=im.size

a = np.array(pxl)
plt.hist(a, bins = 255)
plt.title("histogram") 
plt.show()

我想要直方图

2 个答案:

答案 0 :(得分:0)

直方图中的间隙是由于箱尺寸选择不当所致。如果调用hist(..., bins=255),numpy将从数组的最小值到最大值创建256个bin。换句话说,垃圾箱的宽度将为非整数(在我的测试中为[ 24. , 24.86666667, 25.73333333, 26.6 , ....])。

由于要处理的图像具有255个级别,因此应创建255个宽度为1的纸槽:

plt.hist(a, bins=range(256))

我们必须写256,因为我们需要包括垃圾箱的最右边,否则将不包含值255的点。

关于颜色,请遵循问题linked in the comments

中的示例
from PIL import Image
im=Image.open("lena.pgm")
a = np.array(im.getdata())

fig, ax = plt.subplots(figsize=(10,4))
n,bins,patches = ax.hist(a, bins=range(256), edgecolor='none')
ax.set_title("histogram")
ax.set_xlim(0,255)


cm = plt.cm.get_cmap('cool')
norm = matplotlib.colors.Normalize(vmin=bins.min(), vmax=bins.max())
for b,p in zip(bins,patches):
    p.set_facecolor(cm(norm(b)))
plt.show()

enter image description here

答案 1 :(得分:0)

您可以像这样使用 plt.hist() 方法:

import cv2
import matplotlib.pyplot as plt

img = cv2.imread('lena.png', 0)
plt.hist(img.ravel(), 256, (0, 256))
plt.show()

输出:

enter image description here