2014-09-21 107 views
2

儘管不是一個熟練的GUI程序員,我想出瞭如何使用pyqtgraph模塊的ImageView函數來顯示一個圖像,我可以平移/縮放並點擊以獲得精確的像素座標。完整的代碼如下。唯一的問題是ImageView顯然只能顯示單通道(單色)圖像。 (我忽略了直方圖,標準和ROI特徵,我並不需要),但是可以選擇顯示一個真彩色圖像(例如,原始的JPEG照片)?如何顯示類似於pyqtgraph ImageView的可點擊RGB圖像?

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_() 
+0

如果您刪除了關於平移的部分,會更好。只有關於顏色的部分對問題至關重要。 – Veedrac 2014-09-21 05:49:57

+0

我恭敬地不同意。我知道如何顯示靜態彩色圖像,但不知道如何使用內置的便捷平移,縮放和使用鼠標來獲取像素座標。這個問題的確切點在於是否存在一個框架(或編程技巧),使我能夠輕鬆完成所有這些工作,而不需要至少兩倍的代碼行和八倍的GUI編程知識。如果這種看似明顯的組合根本不存在,那將回答我的問題。 – 2014-09-21 13:05:33

+0

也許我誤解了,但肯定足以說明你正在使用Qt。我只是說,縮短代碼和前面的文本可能會更好。雖然我不知道Qt,所以我不能說真的。 – Veedrac 2014-09-21 14:15:12

回答

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

1)出於某種原因,你給的例子不適用於我 - 它在屏幕上閃爍一個窗口,然後立即消失,所以我不能告訴它如何渲染圖像。 2)我用我自己的代碼發佈在頂部的經驗是,如果我傳遞完整圖像(例如,使用img = photo),它將顯示呈現爲單色的rgb圖像,而不是顏色。這不是我個人認爲的「支持」rgb顯示。它在其他環境中的表現有何不同? – 2014-09-23 21:51:11

+1

1)您需要在交互式python shell(僅限PyQt4;這不適用於PySide)中運行它,或者將'QtGui.QApplication.exec _()'添加到腳本的末尾。 2)你傳遞給ImageView的彩色圖像陣列的形狀是什麼?它必須是(W,H,3)或(W,H,4)。 – Luke 2014-09-23 22:07:43

+0

1)添加QtGui.QApplication.exec_()語句解決了第一個問題(我還必須添加'從pyqtgraph導入QtGui')。 2)你是對的;在我最初的嘗試中,形狀是錯誤的。我本來應該使用 photon = photo.transpose([1,0,2]) 將RGB保留在最後一個維度。 – 2014-09-23 22:30:40

1

正如盧克指出,ImageView的()確實顯示RGB,提供傳遞正確的數組形狀。在我的示例程序中,我應該使用photo.transpose([1,0,2])將RGB保留在最後一個維度上,而不僅僅是photo.transpose()。當ImageView遇到一個尺寸數組(3,W,H)時,它會將該數組視爲由3個單色圖像組成的視頻,並在底部使用滑塊來選擇該幀。

(更正後引入盧克的後續評論,如下)

+0

更正:pyqtgraph.ImageView將一個形狀爲(3,W,H)的陣列解釋爲一個三幀視頻。此數據底部應顯示一個時間滑塊。 – Luke 2014-09-24 03:27:50