Как отобразить кликабельное изображение RGB, похожее на pyqtgraph ImageView?

Несмотря на то, что я не являюсь опытным программистом с графическим интерфейсом, я понял, как использовать функцию ImageView модуля pyqtgraph для отображения изображения, которое я могу панорамировать/масштабировать и щелкнуть, чтобы получить точные координаты пикселей. Полный код приведен ниже. Единственная проблема заключается в том, что ImageView, по-видимому, может отображать только одноканальное (монохромное) изображение.

Мой вопрос: как мне сделать ТОЧНО то же самое, что и эта программа (игнорируя функции гистограммы, нормы и ROI, которые мне действительно не нужны), но с возможностью отображения изображения в истинном цвете (например, исходной фотографии JPEG). )?

    import numpy as np
    from pyqtgraph.Qt import QtCore, QtGui
    import pyqtgraph as pg
    import matplotlib.image as mpimg

    # Load image from disk and reorient it for viewing

    fname = 'R0000187.JPG'    # This can be any photo image file
    photo=np.array(mpimg.imread(fname))
    photo = photo.transpose()
    # select for red color and extract as monochrome image
    img = photo[0,:,:]  # WHAT IF I WANT TO DISPLAY THE ORIGINAL RGB IMAGE?

    # Create app
    app = QtGui.QApplication([])

    ## Create window with ImageView widget
    win = QtGui.QMainWindow()
    win.resize(1200,800)
    imv = pg.ImageView()
    win.setCentralWidget(imv)
    win.show()
    win.setWindowTitle(fname)


    ## Display the data 
    imv.setImage(img)

    def click(event):
        event.accept()  
        pos = event.pos()
        print (int(pos.x()),int(pos.y()))

    imv.getImageItem().mouseClickEvent = click

    ## Start Qt event loop unless running in interactive mode.
    if __name__ == '__main__':
        import sys
        if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):
            QtGui.QApplication.instance().exec_()

person Grant Petty    schedule 21.09.2014    source источник
comment
Было бы лучше, если бы вы удалили части о панорамировании. Только часть о цвете имеет значение для вопроса.   -  person Veedrac    schedule 21.09.2014
comment
Я с уважением не согласен. Я знаю, как отображать статические цветные изображения, но не в пакете, который также предоставляет встроенные удобные функции панорамирования, масштабирования и использования мыши для получения координат пикселей. Точная точка этого вопроса заключается в том, существует ли фреймворк (или программный трюк), который позволяет мне легко делать ВСЕ эти вещи, не требуя по крайней мере вдвое больше строк кода и в восемь раз больше знаний в области программирования с графическим интерфейсом. Если такой, казалось бы, очевидной комбинации просто не существует, это ответ на мой вопрос.   -  person Grant Petty    schedule 21.09.2014
comment
Возможно, я неправильно понял, но этого достаточно, чтобы заявить, что вы используете Qt. Я просто говорю, что было бы лучше немного сократить код и предшествующий ему текст. Я лично не знаком с Qt, поэтому ничего не могу сказать.   -  person Veedrac    schedule 21.09.2014


Ответы (2)


pyqtgraph.ImageView поддерживает изображения rgb/rgba. Например:

import numpy as np
import pyqtgraph as pg
data = np.random.randint(255, size=(100, 100, 3))
pg.image(data)

..и если вы хотите отобразить точные данные изображения без автоматической регулировки уровня:

pg.image(data, levels=(0, 255))
person Luke    schedule 22.09.2014
comment
1) По какой-то причине приведенный вами пример у меня не работает - на экране мигает окно, которое затем сразу же исчезает, поэтому я не могу сказать, как он отображает изображение. 2) Мой опыт работы с моим собственным кодом, который я разместил вверху, заключается в том, что если я передаю полное изображение (например, использую img = photo), оно отображает изображение rgb, отображаемое как монохромное, а не как цветное. Это не то, что я лично рассматривал бы как поддержку дисплея RGB. В других средах он ведет себя иначе? - person Grant Petty; 24.09.2014
comment
1) Вам нужно либо запустить это в интерактивной оболочке Python (только PyQt4; это не работает с PySide), либо добавить QtGui.QApplication.exec_() в конец скрипта. 2) Какова форма массива цветных изображений, который вы передаете в ImageView? Это должно быть (W, H, 3) или (W, H, 4). - person Luke; 24.09.2014
comment
1) Добавление оператора QtGui.QApplication.exec_() решило первую проблему (мне также пришлось добавить «из pyqtgraph import QtGui»). 2) Вы правы; форма была неправильной в моей первоначальной попытке. Я должен был использовать photon = photo.transpose([1,0,2]), чтобы сохранить RGB в последнем измерении. - person Grant Petty; 24.09.2014

Как указал Люк, ImageView() действительно отображает RGB, при условии, что передается правильная форма массива. В моем примере программы я должен был использовать photo.transpose([1,0,2]), чтобы сохранить RGB в последнем измерении, а не просто photo.transpose(). Когда ImageView сталкивается с массивом измерения (3, W, H), он обрабатывает массив как видео, состоящее из 3 монохромных изображений с ползунком внизу для выбора кадра.

(Исправлено, чтобы включить последующий комментарий Люка ниже)

person Grant Petty    schedule 23.09.2014
comment
Исправление: pyqtgraph.ImageView интерпретирует массив в форме (3, W, H) как трехкадровое видео. Вы должны увидеть бегунок времени внизу для этих данных. - person Luke; 24.09.2014