Сохранение 16-битного изображения в opencv с помощью cmap (cv :: ColorMap поддерживает только исходные изображения типа CV_8UC1 или CV_8UC3 в функции 'operator ()') - PullRequest
1 голос
/ 23 января 2020

Я пытаюсь сохранить / показать 16-битный массив numpy (как изображение) в opencv с cmap, он не работает. С другой стороны, в matplotlib все работает гладко.

Моя модель глубокого обучения дает массив numpy arr (<class 'numpy.ndarray'>). Вы можете получить его из здесь .

# np array predicted from a depth model
>>> arr16 = np.load('pred_depth_scale.npy')
>>> arr16.dtype, arr16.shape
(dtype('uint16'), (466, 492))
>>> cv2.imshow('img', arr16)
# shows image in grayscale

uint16_cv2_imshow

Я хочу преобразовать его в другую цветовую карту:

>>> arr16 = cv2.applyColorMap(arr16, cv2.COLORMAP_COOL)

Выдает следующую ошибку:

ошибка: OpenCV (4.1.0) /io/opencv/modules/imgproc/src/colormap.cpp:684: ошибка: ( -5: неверный аргумент) cv :: ColorMap поддерживает только исходные изображения типа CV_8UC1 или CV_8UC3 в функции 'operator ()'

Теперь, если я преобразую изображение в uint8, изображение содержит шум.

>>> arr8 = arr16.astype(np.uint8)
>>> arr8 = cv2.applyColorMap(arr8, cv2.COLORMAP_COOL)
>>> cv2.imshow('img', arr8)

uint8_cv2_imshow

С другой стороны, с matplotlib, cmap отлично работает следующим образом:

>>> plt.imshow(arr16, cmap='magma')

uint16_plt_imshow

Мой вопрос : Как сохранить / показать 16-битное изображение в opencv с помощью cmap?

1 Ответ

0 голосов
/ 28 января 2020

Шум на 8-битном изображении во время печати был вызван неправильным масштабированием. Его можно масштабировать с 16-битного ([0 ... 65535] до 8-битного [0 ... 255]) следующим (благодаря @HansHirse в комментариях) :

arr8 = (arr16/256).astype(np.uint8).

matplotlib внутренне преобразует изображение в 32-разрядное плавающее внутреннее значение перед его отображением, а цветовые карты ограничены 8-разрядными (согласно проблеме github ):

Мы внутренне преобразуем в 32-разрядные операции с плавающей точкой в ​​конвейере нормализации, затем примените палитры цветовой карты, которые обычно ограничены 255 значениями, но вы можете создавать свои собственные палитры с большим количеством значений.

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