Нарисуйте несколько изображений RGB и гистограмму рядом в сетке - PullRequest
1 голос
/ 13 апреля 2019

У меня есть 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 Ответ

0 голосов
/ 13 апреля 2019

Вы должны проверить 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()
...