我有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()
目前,我的图像和直方图相互重叠,我无法弄清楚如何有效地绘制它们
答案 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()