Отображение нескольких изображений RGB и гистограммы рядом в сетке

#python #python-3.x #matplotlib #opencv3.0

#python #python-3.x #matplotlib #opencv3.0

Вопрос:

У меня есть 10 изображений RGB, и я рассчитал гистограммы его отдельных каналов. Я хочу отобразить изображения и их гистограммы RGB на сетке размером 10 x 2 с 0-м столбцом, представляющим все изображения, и 1-м столбцом, представляющим их соответствующие гистограммы (R, G, B), объединенные.Что-то вроде этого:

Гистограммы

image_source: https://lmcaraig.com/image-histograms-histograms-equalization-and-histograms-comparison/#2dhistogram

Я проверил несколько вариантов в Интернете, но все еще чувствую, что чего-то не хватает. Мое замешательство связано с непониманием полного поведения plt.plot против plt.imshow.

Я использую matplotlib и opencv

Я уже попробовал несколько вариантов. Вот мой код

 from matplotlib import pyplot as plt

w=10
h=10
fig=plt.figure(figsize=(8, 8))
columns = 2
rows = 10
color = ('r', 'g', 'b')
for ii in range(1, rows  1):
    fig.add_subplot(rows, columns, ii)
    img = bad_images_numpy[ii 400,:,:,:] #bad_images_numpy shape-> (4064,64,64,3)
    plt.imshow(img)
    fig.add_subplot(rows, columns, ii 1)
    for i,col in enumerate(color):
        histr = cv2.calcHist([img],[i],None,[256],[0,256])
        plt.plot(histr,color = col)
        plt.xlim([0,256])
plt.show()
  

В настоящее время мои изображения и гистограммы накладываются друг на друга, и я не могу понять, как их эффективно отображать

Комментарии:

1. Вы обнаружите проблему, распечатав ii и ii 1 выполнив цикл.

Ответ №1:

Вы должны проверить plt.subplots() и plt.subplot() , затем отобразить гистограммы / изображения по осям, а не plt.imshow() или plt.plot() .

Вот аналогичная функция, которую я написал некоторое время назад для той же цели. Это показывает гистограммы слева, изображение справа. Я уверен, что вы можете изменить его, чтобы показать другой путь.

 def histogram_img(img, title=None):
    plt.figure(figsize=(16,6))
    ax1 = plt.subplot(1, 2, 1)
    ax2 = plt.subplot(1, 2, 2)

    colors = ('b','g','r')
    histograms = []

    for i in range(3):
        hist = cv2.calcHist([img], [i], None, [256], [0,255])
        histograms.append(hist)

        ax1.plot(hist, color=colors[i])


    tmp_img = cv2.bitwise_and(img, img, mask=mask)
    ax2.imshow(cv2.cvtColor(tmp_img,cv2.COLOR_BGR2RGB))
    ax2.grid(False)
    ax2.axis('off')    

    if title is not None:
        plt.title =  title

    plt.show()
  

Комментарии:

1. Отличный ответ, спасибо, и в соответствии с pyimagesearch.com/2014/01/22 / … , вычисление hist может быть hist = cv2.calcHist([chan], [0], None, [256], [0, 256]) , просто любопытно, почему вы выбираете диапазон [0, 255] , но не [0, 256] ?

2. @tli2020 Я смутно помню, что я это сделал, потому что значения пикселей никогда не равны 256.

3. Ага, кажется, что мы могли бы использовать [0, 256] , см.: docs.opencv.org/master/d1/db7/tutorial_py_histogram_begins.html