PyQt5 将 2d np 数组转换为 QImage

Posted

技术标签:

【中文标题】PyQt5 将 2d np 数组转换为 QImage【英文标题】:PyQt5 Convert 2d np array to QImage 【发布时间】:2020-02-13 05:25:53 【问题描述】:
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_())

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

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

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

https://srinikom.github.io/pyside-docs/PySide/QtGui/QImage.html#PySide.QtGui.QImage

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

【问题讨论】:

为什么要删除#import 语句?它使您的代码无法运行,因此更难为您提供帮助。 您希望在图像中显示颜色吗?如果是这样,它的形状必须是 500,500,3 以容纳 3 个 RGB 通道并具有 RGB888 类型。如果你只想要黑色/白色/灰色,你的形状是正确的,但你需要告诉 Qt 是灰度的。 您的数组是 float64,当您需要 int8 时:img = np.ones((500, 500), dtype=dtype=np.uint8)。也许你还想要 RGB 版本img = np.ones((3, 500, 500) ... ` img = np.zeros((500, 500, 3), dtype=np.uint8) qImg = QPixmap( QImage(img.data, img.shape[0], img.shape[ 1], QImage.Format_RGB888)) label.setPixmap(qImg) ` np.zeros 和 one 都给我一个黑色图像。你能解释一下原因吗? 【参考方案1】:

有几个问题:

创建 Numpy 图像数组时,dtype 必须是 np.uint8 您的format 必须是QImage.Format_RGB888 您的像素需要大于01 才能显示,完整范围为0..255

所以,考虑到这一点:

#!/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()

++(将 2D 图像转换为黑白图像)

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

它会创建一个窗口

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

【讨论】:

@Sean 而不是QImage.Format_Indexed8,您应该使用QImage.Format_Grayscale8 来确定音调。 我又编辑了一次,顺便说一句,非常感谢您的回答! 很酷,还要感谢@Demi-Lune 祝你的项目好运,记住,问题(和答案)是免费的,所以如果你遇到困难,请回来。

以上是关于PyQt5 将 2d np 数组转换为 QImage的主要内容,如果未能解决你的问题,请参考以下文章

将 2d 矩阵转换为 3d 单热矩阵 numpy

ValueError: Expected 2D array, got 1D array 相反,在将 1D 数组转换为 2D 后坚持

向量之间的角度 - 只有长度为1的数组可以转换为Python标量

如何使用 np.newaxis 将 (1,16) 数组转换为 (1,16,1) 数组? [复制]

将 char 2d 数组转换为 2d char 数组列表时出现问题

如何将2d Integer数组转换为2d String数组?