PyQt5 конвертировать 2d np массив в QImage - PullRequest
1 голос
/ 13 февраля 2020
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_())

В этом коде я пытаюсь отобразить массив 2d np в QtWindow.

Я ожидаю увидеть белый квадрат, но получаю странное отображение, как показано ниже.

Я считаю, что это потому, что неправильный QImage.Format (тип данных), поэтому я попробовал все варианты, но не помогло.

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

Должен ли я сначала изменить массив np на jpg или png, как примеры в документации?

enter image description here

1 Ответ

2 голосов
/ 13 февраля 2020

Есть несколько проблем:

  • Ваш dtype должен быть np.uint8, когда вы создаете Numpy массив изображений
  • Ваш 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()

enter image description here

++ (для преобразования 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))

Это создаст окно

enter image description here

Ключевые слова : Python, Qt, QImage, QPixmap, обработка изображений.

...