2016-07-07 118 views
2

我想使用numpy.histogram来绘制图像的RGB直方图。如何显示图像直方图上的范围值?

(见我的函数如下draw_histogram

它非常适用常规范围[0,255]:

import numpy as np 
import matplotlib.pyplot as plt 

im = plt.imread('Bulbasaur.jpeg') 
draw_histogram(im, minimum=0., maximum=255.) 

Bulbasaur.jpegHistogram_Bulbasaur

我想要做什么:

我期待我使用的图像超出范围值。有时他们会超出范围,有时不会。我想使用RGB直方图来分析这些值的超出范围。

假设我期望值在区间[-512,512]最差。我仍然希望直方图在正确的位置显示范围内的强度,并将未填充的范围部分留空。例如,如果我再次绘制了Bulbasaur.jpeg的直方图,但范围为[-512,512],我希望看到相同的直方图,但沿“x”轴收缩(在下面的直方图中的两条虚线之间)。

问题:

当我尝试绘制直方图的unregular范围,不顺心的事:

import numpy as np 
import matplotlib.pyplot as plt 

im = plt.imread('Bulbasaur.jpeg') 
draw_histogram(im, minimum=-512., maximum=512.) 

enter image description here

我为draw_histogram()代码:

def draw_histogram(im, minimum, maximum): 

    fig = plt.figure() 
    color = ('r','g','b') 

    for i, col in enumerate(color): 
     hist, bins = np.histogram(im[:, :, i], int(maximum-minimum), (minimum, maximum)) 
     plt.plot(hist, color=col) 
     plt.xlim([int(minimum), int(maximum)]) 

    # Draw vertical lines to easily locate the 'regular range' 
    plt.axvline(x=0, color='k', linestyle='dashed') 
    plt.axvline(x=255, color='k', linestyle='dashed') 

    plt.savefig('Histogram_Bulbasaur.png') 
    plt.close(fig) 

    return 0 

问题

有谁知道正确绘制RGB直方图unregular范围的方法吗?

+0

删除评论,意识到问题所在。 –

回答

1

你应该通过X值 'plt.plot'

我改变:

plt.plot(hist, color=col) 

这样:

plt.plot(np.arange(minimum,maximum),hist, color=col) 

随着这一变化,图形开始正常显示。实质上,plt.plot试图开始绘制你从np.hist开始给它的y值,从0开始。当你期望的范围从0开始时,这种方式起作用,但是当你想包含负数时,plt.plot不应该从0开始,而应该从最小开始,所以使用np.range手动分配x值可以修复问题。

enter image description here