2012-03-20 4 views
16

이미지를 NumPy 배열로 변환하여 PySide QPixmap에 표시 할 수 있도록했습니다 (편집 : 내 PySide UI에서). 이미이 도구를 찾았습니다 : qimage2ndarray,하지만 PyQt4에서만 작동합니다. PySide로 작업하기 위해 변경하려고 시도했지만 도구의 C 부분을 변경해야하고 C에 대한 경험이 없습니다. 어떻게해야합니까? 아니면 어떤 대안이 있습니까?numpy 배열을 PySide로 변환 QPixmap

답변

12

한 가지 대안은 PIL 라이브러리를 사용하는 것입니다.

>>> import numpy as np 
>>> import Image 
>>> im = Image.fromarray(np.random.randint(0,256,size=(100,100,3)).astype(np.uint8)) 
>>> im.show() 

http://www.pyside.org/docs/pyside/PySide/QtGui/QImage.html에서 QPixmap 생성자를 볼 수 있습니다.

그것은 당신이 생성자에서 직접 NumPy와 배열을 사용할 수있을 것 같습니다

:

클래스 PySide.QtGui.QImage (데이터, 폭, 높이, 형식)

형식 인수는 http://www.pyside.org/docs/pyside/PySide/QtGui/QImage.html#PySide.QtGui.PySide.QtGui.QImage.Format 중 하나입니다. 내가 PySide 내가 이것을 테스트하지 않았습니다 때문에 설치하지 않은

>>> a = np.random.randint(0,256,size=(100,100,3)).astype(np.uint32) 
>>> b = (255 << 24 | a[:,:,0] << 16 | a[:,:,1] << 8 | a[:,:,2]).flatten() # pack RGB values 
>>> im = PySide.QtGui.QImage(b, 100, 100, PySide.QtGui.QImage.Format_RGB32) 

:

그래서, 예를 들어, 당신은 뭔가를 할 수 있습니다. 기회는 그대로있는 것은 아니지만 올바른 방향으로 인도 할 수 있습니다. 당신은 PIL에 의존하고 싶지 않은 경우, PIL 사용에 대한 @ user545424 대답에 추가

+0

죄송합니다. 언급하지 않았습니다. 내 PySide UI에서 이미지를 표시하고 싶습니다. 불행히도 그렇게 할 수는 없습니다. – AntonS

+0

두번째 줄을'b = (255 << 24 | a [:, :,, 0] << 16 | a [:, :, 1] << 8 | a [:, :, 2])' 그리고 효과가있었습니다. 고마워요! – AntonS

+0

그레이트 솔루션! 그것이 나를 위해 작동하도록, 나는 약간의 변화를 만들고 PySide.QIGui.QImage.Format_ARGB32를 사용해야했습니다. 나머지는 같습니다. –

4

, 수동으로 순이익 배열에서 직접 이미지를 만들 수 있습니다 :

width = 100 
height = 100 
data = np.random.randint(0,256,size=(width,height,3)).astype(np.uint8) 

img = QtGui.QImage(width, height, QtGui.QImage.Format_RGB32) 
for x in xrange(width): 
    for y in xrange(height): 
     img.setPixel(x, y, QtGui.QColor(*data[x][y]).rgb()) 

pix = QtGui.QPixmap.fromImage(img) 

을 내가 사용, 확신 PIL, 실제 이미지 데이터를 QImage로 읽는 방법이 있지만, @ user545424는 그의 대답부터 그 부분을 처리 할 것입니다. PIL은 Image -> QPixmap을 직접 변환하는 데 편리한 ImageQt 모듈과 함께 제공됩니다.하지만 불행히도 PyQt4 QPixmap은 도움이되지 않습니다.

+1

감사합니다. 하지만 약 3 초가 걸리는데, 이는 내 응용 프로그램에 너무 느립니다. – AntonS

+2

@AntonS'PySide'와 함께'ImageQt'를 사용할 수도 있습니다. 'import ImageQt' 전에'sys.modules [ 'PyQt4'] = PySide'라고 쓸 수 있습니다. 예제 코드 : http://pastebin.com/DX2pbdpV. 그러나 나는 무엇이 더 빠를 지 모른다. – reclosedev

+0

대단히 감사합니다! 이것은 효과가 있지만 user545425s 코드는 조금 더 빠르며 PIL – AntonS

10

예를 들어 numpy를 사용하여 직접 데이터를 만드는 경우 가장 빠른 방법은 QImage에 직접 액세스하는 것입니다. 버퍼 객체 인 QImage.bits()에서 ndarray를 생성하고, numpy 메소드를 사용하여 작업하고, 완료되면 QImage에서 QPixmap을 생성 할 수 있습니다. 기존 QImage를 읽거나 수정할 수도 있습니다.

import numpy as np 
from PySide.QtGui import QImage 

img = QImage(30, 30, QImage.Format_RGB32) 
imgarr = np.ndarray(shape=(30,30), dtype=np.uint32, buffer=img.bits()) 

# qt write, numpy read 
img.setPixel(0, 0, 5) 
print "%x" % imgarr[0,0] 

# numpy write, qt read 
imgarr[0,1] = 0xff000006 
print "%x" % img.pixel(1,0) 

배열이 이미지 개체보다 오래 남아 있지 않은지 확인하십시오. 원한다면 alpha, red, green 및 blue 비트에 대한 개별 액세스를위한 레코드 배열과 같은 더 정교한 dtype을 사용할 수 있습니다 (endianess에주의하십시오).

numpy를 사용하여 픽셀 값을 효율적으로 계산할 수없는 경우 scipy.weave를 사용하여 img.bits()가 가리키는 배열에서 작동하는 일부 C/C++ 코드를 인라인 할 수 있습니다.

이미 ARGB 형식의 이미지가있는 경우 이전에 제안 된대로 데이터에서 QImage를 만드는 것이 더 쉽습니다.

관련 문제