matplotlib imshow графики разные, если использовать colormap или RGB массив

У меня возникает следующая проблема: я сохраняю 16-битные изображения TIFF с помощью микроскопа, и мне нужно их проанализировать. Я хочу сделать это с помощью numpy и matplotlib, но когда я хочу сделать что-то так же просто, как прорисовать изображение зеленым (мне потом придется накладывать другие изображения), он терпит неудачу.

Вот пример, когда я пытаюсь построить изображение либо как массив RGB, либо со стандартным набором цветов.

 import numpy as np import matplotlib.pyplot as plt import cv2 imageName = 'image.tif' # image as luminance img1 = cv2.imread(imageName,-1) # image as RGB array shape = (img1.shape[0], img1.shape[1], 3) img2 = np.zeros(shape,dtype='uint16') img2[...,1] += img1 fig = plt.figure(figsize=(20,8)) ax1 = fig.add_subplot(1,2,1) ax2 = fig.add_subplot(1,2,2) im1 = ax1.imshow(img1,interpolation='none') im2 = ax2.imshow(img2,interpolation='none') fig.show() 

Который мне дает следующий рисунок: введите описание изображения здесь

Прошу прощения, если вопрос слишком прост, но я понятия не имею, почему именно этот сюжет показывает эти артефакты. Я хотел бы получить зеленый масштаб, что-то вроде того, как выглядит фигура (imageJ также дает нечто похожее на левый сюжет).

Большое спасибо за сотрудничество.

One Solution collect form web for “matplotlib imshow графики разные, если использовать colormap или RGB массив”

Я нахожу правильный сюжет гораздо более художественным …

matplotlib довольно сложна, когда дело доходит до интерпретации изображений. Это примерно так:

  • если изображение представляет собой массив NxM любого типа, оно интерпретируется через colormap (автомасштабирование, если не указано иное). (В принципе, если массив представляет собой массив с float масштабированный до 0..1, его следует интерпретировать как изображение в градациях серого. Это то, что говорится в документации, но на практике этого не происходит.)

  • если изображение представляет собой массив с плавающей float NxMx3, компоненты RGB интерпретируются как компоненты RGB между 0..1. Если значения вне этого диапазона, они берутся с положительным модулем 1, то есть 1,2 -> 0,2, -1,7 -> 0,3 и т. Д.

  • если изображение представляет собой массив ux8 NxMx3, оно интерпретируется как стандартное изображение (компоненты 0..255)

  • если изображение NxMx4, интерпретация имеет значение выше, но четвертым компонентом является непрозрачность (альфа)

Итак, если вы даете matplotlib массив NxMx3 целых чисел, отличных от uint8 или float , результаты не определены. Однако, глядя на исходный код, можно понять нечетное поведение:

 if A.dtype != np.uint8: A = (255*A).astype(np.uint8) 

где A – массив изображений. Итак, если вы дадите ему uint16 значения 0, 1, 2, 3, 4 …, вы получите 0, 255, 254, 253, … Да, это будет выглядеть очень странно. (ИМХО, интерпретация может быть немного более интуитивной, но так оно и делается).


В этом случае самым простым решением является разделение массива на 65535. Затем изображение должно быть таким, как ожидалось. Кроме того, если ваше исходное изображение действительно линейно, вам необходимо сделать обратную гамма-коррекцию:

 img1_corr = (img1 / 65535.)**(1/2.2) 

В противном случае ваши средние тона будут слишком темными.

Interesting Posts

сравнение строки в столбце и создание соответствующего нового столбца в python

Каков наиболее эффективный способ в Python преобразовать строку во все строчные буквы, удаляя все альфа-символы без ascii?

Subclassing dict: должен ли вызывать .__ init __ ()?

Декартово произведение больших итераторов (itertools)

odoo 9 – Поле не существует

Как отправить электронное письмо нескольким получателям, используя python smtplib?

Reindexing pandas timeseries от объекта dtype до datetime dtype

Как добавить целое число в строку в python – API Oanda

из Crypto import Random -> ImportError: невозможно импортировать имя Random

Как проверить, содержит ли RGB-изображение только один цвет?

Клиент Python Paho публикует неудачи с по крайней мере 1 пропущенным издательством

Использование памяти назначения питона Python

функция для переключения кадров в python, селен

Как динамически вставлять функции C из Python в Linux (без LD_PRELOAD)?

Строки Python заканчиваются завершающим NULL?

Python - лучший язык программирования в мире.