私はPyQt4で単純なビューアを使用していますが、numpy配列(8ビットグレースケール)からQImageを表示するときに奇妙な動作があります。メモリの順序を更新する必要がある(つまり、異なるストライドのビューではない)場合でも、転置された配列からQImageを作成しようとすると、何か変わっているように思えます。numpy配列をQImageに変換するときのメモリの順序の動作の問題
以下ビューアの多額のカットダウン版です:
今import numpy as np
from PyQt4 import QtGui
class SimpleViewer(QtGui.QMainWindow):
def __init__(self, data, parent=None):
super(SimpleViewer, self).__init__(parent=parent)
hgt, wid = data.shape
dmin = data.min()
dmax = data.max()
bdata = ((data - dmin)/(dmax - dmin)*255).astype(np.uint8)
img = QtGui.QImage(bdata, wid, hgt, QtGui.QImage.Format_Indexed8)
self.scene = QtGui.QGraphicsScene(0, 0, wid, hgt)
self.px = self.scene.addPixmap(QtGui.QPixmap.fromImage(img))
self.view = QtGui.QGraphicsView(self.scene)
self.setCentralWidget(self.view)
if __name__ == "__main__":
app = QtGui.QApplication.instance()
if app is None:
app = QtGui.QApplication(['python'])
xx, yy = np.meshgrid(np.arange(-100,100), np.arange(350))
zz = xx * np.cos(yy/350.*6*np.pi)
viewer = SimpleViewer(zz)
viewer.show()
app.exec_()
、これは結構です、このような何か、生成されるよう-:私は、しかし
を最初の次元を「x」、2番目の次元を「y」とするために、実際の画像を転置する必要があります(原点が左下ですが、ここでは範囲外です)。
hgt, wid = data.shape
をwid, hgt = data.shape
に変更して何もしない(間違っている)場合は、次のようになります。 QImageはメモリを読み込むだけなので意味があります。
しかし、bdata.T.copy()
代わりのbdata
におけるI もパスならば、私は配列を転置し、メモリコピー操作によって再注文されることを期待しています。しかし、私が得ることはこれです:
それはので近いが、何らかの理由のためだけの髪でオフです。また、大きさがちょうど整数倍(たとえば200x100)であれば大丈夫だと気付きました。何が起こっている? 私は本当に本当に馬鹿なことを見逃しましたか?
これはPyQtの問題かnumpyの問題なのかどうかはわかりません...転置された配列はmatplotlibでうまくプロットされますが、matplotlibはストライディングを処理します。
私はPython 2.7とPython 3.5で同じ動作をします。 PyQt4バージョンはQtバージョン4.8.7を使用して4.11.4です。ナンシーバージョンは1.10.1です。
Whoa。何らかの理由で私は "データは32ビットで整列されていなければなりません"で読み込みを停止していなければなりませんし、 "と**それぞれの走査線**も32ビットで整列しなければなりません"。 *慎重に*ドキュメントを読むことの教訓 – Ajean