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
您的像素需要大于0
或1
才能显示,完整范围为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的主要内容,如果未能解决你的问题,请参考以下文章
ValueError: Expected 2D array, got 1D array 相反,在将 1D 数组转换为 2D 后坚持
向量之间的角度 - 只有长度为1的数组可以转换为Python标量
如何使用 np.newaxis 将 (1,16) 数组转换为 (1,16,1) 数组? [复制]