Numpy PyQt5将2d np数组转换为QImage

Numpy PyQt5将2d np数组转换为QImage,numpy,pyqt5,qt5,Numpy,Pyqt5,Qt5,在这段代码中,我试图在QtWindow上显示2d np数组 我期待看到一个白色的正方形,但我一直得到一个奇怪的显示如下 我相信这是因为错误的QImage.Format(数据类型),所以我尝试了每一个选项,但没有帮助 我是否应该首先将np数组更改为jpg或png,作为文档中的示例 有几个问题: 创建Numpy图像数组时,您的dtype需要是np.uint8 您的格式需要是QImage.format\u RGB888 您的像素需要大于0或1才能显示,整个范围为0..255 因此,考虑到这一点:

在这段代码中,我试图在QtWindow上显示2d np数组

我期待看到一个白色的正方形,但我一直得到一个奇怪的显示如下

我相信这是因为错误的QImage.Format(数据类型),所以我尝试了每一个选项,但没有帮助

我是否应该首先将np数组更改为jpg或png,作为文档中的示例


有几个问题:

  • 创建Numpy图像数组时,您的
    dtype
    需要是
    np.uint8
  • 您的
    格式
    需要是
    QImage.format\u RGB888
  • 您的像素需要大于
    0
    1
    才能显示,整个范围为0..255
因此,考虑到这一点:

from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QVBoxLayout
from PyQt5.QtGui import QPixmap, QImage
import numpy as np
import sys

def print_np():
    app = QApplication(sys.argv)

    win = QWidget()
    label = QLabel()

    img = np.ones((500, 500))
    qImg = QPixmap(QImage(img.data, img.shape[0], img.shape[1], QImage.Format_Indexed8))
    label.setPixmap(qImg)

    vbox = QVBoxLayout()
    vbox.addWidget(label)
    win.setLayout(vbox)
    win.show()

    sys.exit(app.exec_())

++(将二维图像转换为黑白)

它将创建一个窗口


关键词:Python、Qt、QImage、QPixmap、图像处理。

为什么删除了
#import
语句?它使你的代码无法运行,因此很难帮助你。你希望在你的图像中显示颜色吗?如果是这样,则其形状必须为
500500,3
,以容纳3个RGB通道并具有RGB888类型。如果您只需要黑色/白色/灰色,那么您的形状是正确的,但是您需要告诉Qt是灰色的。当您需要int8时,您的数组是float64:
img=np.ones((500500),dtype=dtype=np.uint8)
。也许您还需要RGB版本的
img=np.one((3500500)..
`img=np.zeros((5005003),dtype=np.uint8)qImg=QPixmap(QImage(img.data,img.shape[0],img.shape[1],QImage.Format_RGB888))label.setPixmap(qImg)`np.0和1都给了我一个黑色图像。你能解释一下原因吗?@Sean而不是
QImage.Format_Indexed8
,你可能应该使用
QImage.Format_Grayscale8
来确定色调。我再次编辑了一遍,顺便说一句,非常感谢你的回答!很酷,还要感谢@Demi Lune祝你的项目好运,记住,ques回答(和答案)是免费的,所以如果你被卡住了,请回来。
#!/usr/bin/env python3

from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QVBoxLayout
from PyQt5.QtGui import QPixmap, QImage
import numpy as np
import sys

def main():
    app = QApplication(sys.argv)

    win = QWidget()
    label = QLabel()

    img = np.zeros((500, 500, 3), dtype=np.uint8)
    # Turn up red channel to full scale
    img[...,0] = 255
    qImg = QPixmap(QImage(img.data, img.shape[0], img.shape[1], QImage.Format_RGB888))
    label.setPixmap(qImg)

    vbox = QVBoxLayout()
    vbox.addWidget(label)
    win.setLayout(vbox)
    win.show()

    sys.exit(app.exec_())

main()
img = np.zeros((500, 500), dtype=np.uint8)
img[250:, :] = 255

qImg = QPixmap(QImage(img.data, img.shape[0], img.shape[1], QImage.Format_Grayscale8))