Почему сохранение изображения с помощью OpenCV приводит к черному изображению?

Итак, я хочу создать белое изображение размером 500x500 с помощью библиотеки Python Numpy, хотя я легко могу сделать это в фотошопе. Приведенный ниже код действителен, а изображение белое (потому что я сохранил изображение с помощью функции cv2.imsave, а позже открыл его с помощью средства просмотра фотографий Windows). Но когда я пытаюсь отобразить его с помощью функции cv2.imshow, отображается черное изображение. Это почему? Это недостаток cv2?

import cv2
import numpy as np

img = np.arange(500*500*3)
for i in range(500*500*3):
    img[i] = 255
img = img.reshape((500, 500, 3))
cv2.imwrite("fff.jpg", img)
cv2.imshow('', img)

person Community    schedule 19.12.2017    source источник
comment
Возможно, вам потребуется отображать массивы с int8 типом данных - img.astype(np.uint8)?   -  person cs95    schedule 19.12.2017
comment
Ты понял. Я изменил третью строку и добавил аргумент dtype = np.uint8, и это сработало. найти его сложно. я трачу часы, чтобы найти это.   -  person    schedule 19.12.2017
comment
Я могу представить, что это повторяющаяся проблема, поэтому я нашел документацию и связался с ней в ответе.   -  person cs95    schedule 19.12.2017


Ответы (1)


Обратите внимание, что модуль cv2 представляет собой тонкую оболочку пакета C ++ OpenCV. Вот документация по нему, и подпись не меняется для функций оболочки python, которые их связывают. Из документации -

void cv::imshow   (const String &winname,
       InputArray     mat 
 )        

Отображает изображение в указанном окне.

Функция imshow отображает изображение в указанном окне. [...]

  • Если изображение 8-битное без знака, оно отображается как есть.
  • Если изображение является 16-битным беззнаковым или 32-битным целым числом, пиксели делятся на 256. То есть диапазон значений [0,255 * 256] отображается на [0,255].
  • Если изображение 32-битное с плавающей запятой, значения пикселей умножаются на 255. То есть диапазон значений [0,1] отображается на [0,255].

По умолчанию массивы numpy инициализируются типом np.int32 или np.int64 (это зависит от вашего компьютера). Если вы хотите, чтобы ваши массивы отображались без каких-либо изменений, вы должны убедиться, что вы передаете их как 8-битные беззнаковые. В вашем случае вот так -

cv2.imshow('', img.astype(np.uint8))

В качестве альтернативы, при инициализации ваших массивов сделайте это как -

img = np.arange(..., dtype=np.uint8)
person cs95    schedule 19.12.2017