оттенки серого cv2 имеют 3 канала и странный голубовато-желтоватый оттенок

#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 объекте совпадают, поэтому, пока вы используете его для обработки, у вас не возникнет проблем. Если мой ответ был тем, что вы искали, вы можете выбрать его в качестве принятого ответа 🙂