在网格中并排绘制多个RGB图像和直方图

时间:2019-04-12 21:40:31

标签: python python-3.x matplotlib opencv3.0

我有10张RGB图像,并且已计算出其各个通道的直方图。我想在10 x 2的网格上绘制图像及其RGB直方图,第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 :(得分:-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()
相关问题