#python #image #cv2 #grayscale
Вопрос:
У меня следующая проблема с cv2, когда я обычно загружаю изображение, все в порядке:
img = cv2.imread(file, cv2.COLOR_BGR2RGB)
plt.imshow(img)
print(img.shape)
Однако, когда я пытаюсь загрузить оттенки серого, у меня возникает следующая проблема
gray = cv2.cvtColor(img, cv2.IMREAD_GRAYSCALE)
plt.imshow(gray)
print(gray.shape)
Это дает мне 4 канала, но, по крайней мере, серое изображение
Но этот код
plt.show()
img = cv2.imread(file, cv2.IMREAD_GRAYSCALE)
print(img.shape)
plt.imshow(img)
plt.show()
дает мне 1 канал, но странное голубовато-желтоватое изображение
Мой вопрос в том, могу ли я загрузить серое изображение с 1 каналом? Спасибо всем вам за уделенное время
Ответ №1:
OpenCV правильно считывает изображение, проблема заключается в imshow()
функции MatPlotLib, поскольку она отображает одноканальные изображения в виде цветных изображений.
Чтобы указать оттенки серого, передайте cmap
параметр функции imshow следующим образом:
img = cv2.imread(file, cv2.IMREAD_GRAYSCALE)
print(img.shape)
plt.imshow(img, cmap="gray")
Примечание: В ваших примерах вы использовали cv2.imread(file, cv2.COLOR_BGR2RGB)
и cv2.cvtColor(img, cv2.IMREAD_GRAYSCALE)
соответственно.
cv2.COLOR_BGR2RGB
и cv2.IMREAD_GRAYSCALE
являются обоими флагами, которые сообщают функциям imread()
и cvtColor()
, как себя вести (например, возвращают изображение в оттенках серого). Хотя обе они принимаются функциями, они могут не выполнять то, что вы от них хотите, и по этой причине рекомендуется использовать только флаги, указанные для каждой функции. Любой флаг, начинающийся с IMREAD_
, должен использоваться только с imread()
функцией OpenCV. Аналогично, любой флаг, начинающийся с COLOR_
, должен использоваться только с cvtColor()
Комментарии:
1. не могли бы вы поподробнее рассказать о записке? Я не уверен, что понимаю. В противном случае спасибо! Было бы правильно предположить, что это проблема imshow, а не проблема cv2? Т. Е. значения в матрице имеют оттенки серого.? (Они предназначены для CNN)
2. @джон Не волнуйся! Я более подробно остановился на примечании и включил тот факт, что это не проблема OpenCV, а просто представление, которое использует matplotlib. Значения в
image
объекте совпадают, поэтому, пока вы используете его для обработки, у вас не возникнет проблем. Если мой ответ был тем, что вы искали, вы можете выбрать его в качестве принятого ответа 🙂