2016-07-07 6 views
2

Я хочу построить гистограммы RGB изображения, используя numpy.histogram.Как отображать значения диапазона на гистограмме изображения?

(См мою функцию 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» (между двумя пунктирными линиями на гистограмме ниже).

Проблема:

Когда я пытаюсь нарисовать гистограмму для нештатных диапазона, что-то идет не так:

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 гистограмму с нештатными диапазонами?

+0

Удаляется комментарий, понял, что проблема была. –

ответ

1

Вы должны передать значения х 'plt.plot'

Я изменилась:

plt.plot(hist, color=col) 

к этому:

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

С этим изменением, график стали появляться нормально. По сути, plt.plot пытался начать рисовать значения y, которые вы дали ему из np.hist, начиная с 0. Это работает, когда ваш ожидаемый диапазон начинается с 0, но если вы хотите включить отрицательные числа, plt.plot не должен начинаться с 0, скорее, он должен начинаться как минимум, поэтому использование np.range для назначения вручную значений x устраняет проблему.

enter image description here