Как установить один и тот же LUT для pg.HistogramLUTItem и pg.ImageItem?

Я хочу использовать определенную карту цветов (LUT) для отображения 2D-массива с помощью pg.ImageItem и добавить рядом с ним pg.HistogramLUTItem для интерактивного анализа. Если я инициализирую изображение, передавая ему свой LUT, а затем рисую его в окне, все в порядке. Однако, когда я создаю pg.HistogramLUTItem и инициализирую его своим изображением, цветовая карта изображения мгновенно меняется на цветовую гамму гистограммы. Как мне установить правильную цветовую карту в гистограмме?

Вот мой минимальный пример:

import numpy as np
import pyqtgraph as pg

myLUT = np.array([[1.        , 1.        , 1.        ],
                  [0.38401946, 0.48864573, 0.963664  ],
                  [0.28766167, 0.81375253, 0.49518645],
                  [0.71970558, 0.92549998, 0.34362429]]) * 255

win = pg.GraphicsLayoutWidget()
win.show()
p1 = win.addPlot()
img = pg.ImageItem(np.random.rand(100, 100), lut=myLUT)
p1.addItem(img)
hist = pg.HistogramLUTItem()
hist.setImageItem(img)

...и тут изображение уже меняется на "по умолчанию" лут гистограммы.

Я бы ожидал, что гистограмма «унаследует» LUT изображения и автоматически примет LookUpTable в цветовой полосе, но на самом деле все наоборот.

Как можно исправить такое поведение? Нужно ли инициализировать гистограмму с помощью myLUT? Я не вижу, как это сделать.


person Pau Gonzalez    schedule 16.10.2019    source источник


Ответы (2)


Как насчет того, чтобы начать с определенной палитры pyqtgraph, а затем сгенерировать из нее LUT:

myLUT = colormap.getLookupTable()

А потом задаешь палитру....

hist.gradient.setColorMap(colormap)
person Björn S    schedule 10.01.2020

Я не думаю, что это можно сделать (но если кто-то может доказать, что я ошибаюсь, дайте мне знать...)

Я думаю, проблема в том, что HistogramLUTItem использует GradientEditorItem для создания таблицы поиска. Этот класс создает LUT путем линейной интерполяции нескольких заданных точек (цветные треугольники рядом с цветной полосой). Класс GradientEditorItem не может обрабатывать произвольные LUT, поэтому класс HistogramLUTItem тоже не может.

Исходный код HistogramLUTItem, кажется, подтверждает это. Например. в методе setImageItem он устанавливает LUT imageItem в редакторе градиента, как вы уже подозревали. строка 147 вызывает img.setLookupTable(self.getLookupTable) , который, в свою очередь, получает таблицу поиска GradientEditorItem, self.lut = self.gradient.getLookupTable(n, alpha=alpha) на строка 178.

Я создал собственный класс цветных полос, который может обрабатывать произвольные таблицы поиска: PgColorBar. Не стесняйтесь использовать его.

Или вы можете создать задачу PyQtGraph здесь.

person titusjan    schedule 16.10.2019
comment
Хорошо. Приятно знать, что по умолчанию невозможно делать то, что я хочу... Я попробую использовать ваш класс. Большое спасибо за твою помощь!!! :-) - person Pau Gonzalez; 17.10.2019