2014-09-21 3 views
2

능숙한 GUI 프로그래머가 아니지만 pyqtgraph 모듈의 ImageView 함수를 사용하여 팬/줌을 클릭하고 정확한 픽셀 좌표를 얻기 위해 이미지를 표시하는 방법을 알아 냈습니다. 전체 코드는 다음과 같습니다. 유일한 문제는 ImageView가 단일 채널 (단색) 이미지 만 표시 할 수 있다는 것입니다.pyqtgraph ImageView와 유사한 클릭 가능한 RGB 이미지를 표시하는 방법?

내 질문 : 정말 필요하지 않은 히스토그램, 표준 및 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_() 
+0

패닝에 대한 부품을 제거하면 더 좋을 것입니다. 색상에 관한 부분 만 질문에 중요합니다. – Veedrac

+0

나는 정중하게 의견이 맞지 않는다. 정적 컬러 이미지를 표시하는 방법을 알고 있지만 패닝, 확대/축소 및 픽셀 좌표를 얻기위한 마우스 사용이 기본 제공되는 패키지에는 포함되어 있지 않습니다. 이 질문의 핵심은 적어도 두 줄의 코드와 8 배의 GUI 프로그래밍 지식 없이도이 모든 것을 쉽게 할 수있는 프레임 워크 (또는 프로그래밍 트릭)가 있는지 여부입니다. 그러한 겉으로보기에 명백한 결합이 단순히 존재하지 않는다면, 그것은 나의 질문에 답할 것입니다. –

+0

아마도 내가 잘못 이해 했겠지만 확실히 Qt를 사용하고 있다고 말하는 것으로 충분합니다. 나는 단지 코드와 앞의 텍스트를 약간 줄이는 것이 더 낫다는 것을 말하고있다. 나는 개인적으로 Qt를 알지 못하지만 그렇게 말할 수는 없습니다. – Veedrac

답변

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 = 사진 사용)를 전달하면 컬러가 아닌 단색으로 렌더링 된 RGB 이미지를 표시한다는 것입니다. 이것은 내가 개인적으로 "지원"rgb 디스플레이라고 생각하는 것이 아닙니다. 다른 환경에서도 다르게 작동합니까? –

+1

1) 대화 형 Python 셸 (PyQt4 전용, PySide에서는 작동하지 않음)에서 실행하거나 스크립트 끝 부분에'QtGui.QApplication.exec _()'를 추가해야합니다. 2) ImageView로 전달할 색상 이미지 배열의 모양은 무엇입니까? 그것은 (W, H, 3) 또는 (W, H, 4)이어야합니다. – Luke

+0

1) QtGui.QApplication.exec_() 문을 추가하면 첫 번째 문제가 해결되었습니다 ('pyqtgraph import QtGui'도 추가해야했습니다). 2) 당신 말이 맞습니다. 원래의 시도에서 모양이 잘못되었습니다. 나는 photon = photo.transpose ([1,0,2]) 을 사용하여 마지막 차원에 RGB를 유지해야했습니다. –

1

, 이미지 뷰()를 디스플레이 RGB를 수행, 제공 올바른 배열 모양이 전달됩니다. 필자의 샘플 프로그램에서는 photo.transpose ([1,0,2])를 사용하여 photo.transpose()가 아닌 마지막 차원에 RGB를 유지해야했습니다. ImageView가 차원 배열 (3, W, H)과 마주 칠 때 배열을 3 개의 단색 이미지로 구성된 비디오로 처리하고 맨 아래에 슬라이더를 사용하여 프레임을 선택합니다.

(아래 Luke의 의견 추가 의견을 포함하도록 수정 됨)

+0

수정 : pyqtgraph.ImageView는 (3, W, H) 모양의 배열을 3 프레임 비디오로 해석합니다. 이 데이터의 하단에 시간 슬라이더가 나타납니다. – Luke