如何显示类似于pyqtgraph ImageView的可点击RGB图像?

Posted

技术标签:

【中文标题】如何显示类似于pyqtgraph ImageView的可点击RGB图像?【英文标题】:How to display clickable RGB image similar to pyqtgraph ImageView? 【发布时间】:2014-11-15 08:40:39 【问题描述】:

尽管不是一个熟练的 GUI 程序员,但我想出了如何使用 pyqtgraph 模块的 ImageView 函数来显示可以平移/缩放并单击以获取精确像素坐标的图像。完整的代码如下。唯一的问题是 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_()

【问题讨论】:

去掉平移的部分会更好。只有关于颜色的部分对问题很重要。 我不同意。我知道如何显示静态彩色图像,但不是在还提供内置方便平移、缩放和使用鼠标获取像素坐标的包中。这个问题的确切点是是否存在一个框架(或编程技巧),它允许我轻松地完成所有这些事情,而无需至少两倍的代码行和八倍的 GUI 编程知识。如果这种看似显而易见的组合根本不存在,那将回答我的问题。 也许我误解了,但肯定足以说明您正在使用 Qt。我只是说稍微缩短代码及其前面的文本可能会更好。不过,我个人并不了解 Qt,所以我不能真正说出来。 【参考方案1】:

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))

【讨论】:

1) 出于某种原因,您给出的示例对我不起作用——它在屏幕上闪烁一个窗口,然后立即消失,所以我不知道它是如何渲染图像的。 2)我在顶部发布的我自己的代码的经验是,如果我传递完整的图像(例如,使用 img = photo),它会显示呈现为单色的 rgb 图像,而不是颜色。这不是我个人认为“支持” rgb 显示的内容。它在其他环境中的行为是否有所不同? 1) 您需要在交互式 python shell 中运行它(仅限 PyQt4;这不适用于 PySide)或在脚本末尾添加 QtGui.QApplication.exec_()。 2) 您传递给 ImageView 的彩色图像数组的形状是什么?它必须是 (W, H, 3) 或 (W, H, 4)。 1) 添加 QtGui.QApplication.exec_() 语句解决了第一个问题(我还必须添加'from pyqtgraph import QtGui')。 2)你是对的;我最初的尝试中的形状是错误的。我应该一直使用 photon = photo.transpose([1,0,2]) 将 RGB 保持在最后一个维度。【参考方案2】:

正如 Luke 所指出的,ImageView() 确实显示 RGB,前提是传递了正确的数组形状。在我的示例程序中,我应该使用 photo.transpose([1,0,2]) 将 RGB 保持在最后一个维度,而不仅仅是 photo.transpose()。当 ImageView 遇到一个维度为 (3, W, H) 的数组时,它会将数组视为由 3 个单色图像组成的视频,底部有一个滑块用于选择帧。

(更正后加入了 Luke 的后续评论,如下)

【讨论】:

更正:pyqtgraph.ImageView 将形状为 (3, W, H) 的数组解释为三帧视频。您应该会在此数据的底部看到一个时间滑块。

以上是关于如何显示类似于pyqtgraph ImageView的可点击RGB图像?的主要内容,如果未能解决你的问题,请参考以下文章

pyqtgraph绘图如何使用pyqtgraph

pyqtgraph:如何在 00:00 时间之前不显示时间序列(使用 AxisItem)

PyQtGraph 崩溃 python

如何以使用 qtdesigner 创建的表单显示 pyqtgraph 图像?

Pyqtgraph - 如何添加轴日期时间?

pyqtgraph:具有与 matplotlib drawstyle 类似功能的绘图