Python中函数matplotlib.pyplot.hist中的一些问题

时间:2017-07-10 08:49:13

标签: python numpy matplotlib

我有一个作业,我需要绘制lena的直方图(着名图片的名称)。 我的直方图中有一些问题。我按照matplot.org中的示例代码进行操作。这是我的代码:

import matplotlib.pyplot as plt
import numpy as np

def rgb2gray(rgb):                                        # rgb to grey
    temp = np.dot(rgb[..., :3], [0.299, 0.587, 0.114])
    new = np.zeros([512,512], 'uint8')
    for i in range(512):
        for j in range(512):
            new[i, j] = round( temp[i, j])                #float to int
    return new

lena = plt.imread("E:\lena.bmp")
lena_gray = rgb2gray(lena)
len, width = lena_gray.shape

n, bins, patches = plt.hist(lena_gray, normed=1)
print(n ,bins, patches)

plt.show()

但我得到的直方图是:

histogram.png

错误是当我放大图片的底部时:

magnify.png

如你所见,66和67之间有很多箱子。但在我的代码中,函数hist中的第一个参数是lena_gray。数组lena_grey中的数字都是整数。所以我想知道为什么我在直方图中的两个数字之间有这么多的二进制数,或者为什么我的x轴上有小数。

1 个答案:

答案 0 :(得分:1)

您正在将矩阵移交给plt.hist,该矩阵被解释为要处理的数组列表。请参阅documentation。计算并显示512列中每列的直方图。如果先将图像矩阵重新整形为矢量,则直方图结果很好:

import matplotlib.pyplot as plt
import numpy as np

def rgb2gray(rgb):                                        # rgb to grey
    return np.dot(rgb[..., :3], [0.299, 0.587, 0.114]).astype(int)

lena = plt.imread("E:\lena.bmp")
lena_gray = rgb2gray(lena)
len, width = lena_gray.shape

# use np.reshape to transform matrix to vector
n ,bins, patches = plt.hist(np.reshape(lena_gray,(-1,1)), normed=1)
print(n ,bins, patches)

plt.show()