imhsow в matplotlib не выглядит так же, как opencv - PullRequest
1 голос
/ 08 мая 2019

Кажется, что matplotlib.pyplot.imhsow (plt.imshow) не показывает исходную картинку, масштабирует ли она значения изображения? Я нашел разницу при использовании cv2.imhsow и plt.imhsow.

У меня есть два изображения, которые отличаются по яркости. Однако при использовании plt.imshow они отображаются одинаково. Но это показывает правильно при использовании cv2.imhow. Вот код и изображения.

import cv2
import matplotlib.pyplot as plt
img_o = plt.imread('1.jpg')
img = plt.imread('2.jpg')
cv2.imshow('img', img)
cv2.imshow('img_o', img_o)
cv2.waitKey(0)
cv2.destroyAllWindows()
plt.gray()
plt.imshow(img)
plt.show()
plt.imshow(img_o)
plt.show()

Изображения, используемые для imshow, отличаются по яркости.

1.jpg
2.jpg

При использовании cv2.imshow они могут отображаться как исходные.

Изображения, показанные plt.imshow, загружены ниже. Они выглядят точно так же, и кажется, что plt.imshow игнорирует яркость изображений.

img img

1 Ответ

1 голос
/ 08 мая 2019

Изображения имеют тип uint8 и 48 x 48 пикселей в форме.Следовательно, imshow в matplotlib будет отображать их с активной картой цветов (plt.gray()).Нормализация цветовой карты выбирается в соответствии с минимумом и максимумом данных.Это становится ясным при построении с цветовой шкалой.

import matplotlib.pyplot as plt
img_o = plt.imread('1.jpg')
img = plt.imread('2.jpg')

fig, (ax, ax2) = plt.subplots(ncols=2)
plt.gray()
im1 = ax.imshow(img)
fig.colorbar(im1, ax=ax)

im2 = ax2.imshow(img_o)
fig.colorbar(im2, ax=ax2)
plt.show()

enter image description here

Из этого мы видим, что для первого изображения белый цвет обозначает значение 70, адля второго белого - 218. Чтобы использовать одинаковую нормализацию в обоих случаях и для соответствия 8-битным изображениям, можно использовать norm = plt.Normalize(0,255)

import matplotlib.pyplot as plt
img_o = plt.imread('1.jpg')
img = plt.imread('2.jpg')

norm = plt.Normalize(0,255)

fig, (ax, ax2) = plt.subplots(ncols=2)
plt.gray()
im1 = ax.imshow(img, norm=norm)
fig.colorbar(im1, ax=ax)

im2 = ax2.imshow(img_o, norm=norm)
fig.colorbar(im2, ax=ax2)
plt.show() 

enter image description here

В качестве альтернативы, вы можете дублировать значения серого на все три канала RGB, так что вы строите массив пикселей 48x48x3.Это будет интерпретировано как изображение (в отличие от цветных данных) и будет отображаться правильно.

import numpy as np
import matplotlib.pyplot as plt
img_o = plt.imread('1.jpg')
img = plt.imread('2.jpg')

img_o = np.dstack((img_o,img_o,img_o))
img = np.dstack((img,img,img))


fig, (ax, ax2) = plt.subplots(ncols=2)
im1 = ax.imshow(img)
im2 = ax2.imshow(img_o)

plt.show() 

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...