#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