отображение необработанных изображений в qt с python - PullRequest
0 голосов
/ 03 апреля 2019

Я использую программу на Python для получения изображения с научной камеры.Эта часть в порядке, я могу получить 16-битное изображение в массиве.Проблема возникает, когда я хочу отобразить изображение в окне qt (я использую QGraphicsWindow), способ отображения изображения очень странный.Чтобы отобразить изображение, я конвертирую 2d массив в растровое изображение, которое затем исчезает.Я пробовал разные вещи, но лучшие результаты получены для следующих кодов:

def array2Pixmap(arr):
arr_uint8 = arr.view(dtype=numpy.uint8)
im8 = Image.fromarray(arr_uint8)
imQt = QtGui.QImage(ImageQt.ImageQt(im8))
pix = QtGui.QPixmap.fromImage(imQt)
return pix

, который дает следующий результат: enter image description here

и этот:

def array2Pixmap(arr):
arr_uint8 = arr.astype(numpy.uint8)
im8 = Image.fromarray(arr_uint8)
imQt = QtGui.QImage(ImageQt.ImageQt(im8))
pix = QtGui.QPixmap.fromImage(imQt)
return pix

, что дает это для точно таких же условий съемки (время экспозиции камеры, интенсивность света и т. Д.): enter image description here

Так что теперь я 'Я ищу способ правильно отобразить изображение.Ты хоть представляешь, что я делаю не так?

Спасибо

РЕДАКТИРОВАТЬ

Вот пример того, что такое обр.Команда print(arr) возвращает

[[100  94  94 ...  97  98  98]
[ 97 100  98 ...  98 101  99]
[100  95  98 ... 104  98 102]
...
[ 98  98  98 ...  96  98 100]
[ 94 100 102 ...  92  98 104]
[ 97  90  96 ...  96  97 100]]

, а print(type(arr)) возвращает

<class 'numpy.ndarray'>

РЕДАКТИРОВАТЬ

Хорошо, у меня есть новости.Я изменил свой код так, что теперь преобразование в 8-битный идентификатор массива выполняется следующим образом:

arr = numpy.around(arr*(2^8-1)/(2^16-1))
arr_uint8 = arr.astype(numpy.uint8)

Если я отображаю изображение с помощью matplotlib.pyplot.imshow(arr, cmap='gray'), оно работает, и изображение отображается в редакторе следующим образом:

enter image description here

, но когда я конвертирую его в QPixmap, результат такой же, как и раньше.

Что странно, когда яиспользуйте arr_uint8 = arr.view(dtype=numpy.uint8) для преобразования в 8 бит, в результате получается массив 2048 * 4096 вместо 2048 * 2048.Я не понимаю, почему ...

Ответы [ 2 ]

0 голосов
/ 05 апреля 2019

Я нашел решение. Фактически, решение @ user545424 не сработало, потому что я использую PyQt5, а формат изображения Format_RGBA64 не поддерживается. Я пытался установить PySide2, но он не сработал, поэтому после некоторых исследований я нашел этот пост: Конвертировать 16-битную шкалу серого в QImage Решение, предложенное в ответе, работает отлично. Вот код, который я использую для отображения моего 16-битного изображения:

from PyQt5 import QtGui
import numpy as np

def array2Pixmap(img):
    img8 = (img/256.0).astype(np.uint8) 
    img8 = ((img8 - img8.min()) / (img8.ptp() / 255.0)).astype(np.uint8)
    img = QtGui.QImage(img8.repeat(4), 2048, 2048, QtGui.QImage.Format_RGB32)

    pix = QtGui.QPixmap(img.scaledToWidth(img.width()*2))
    return pix

Этот код работает, и у меня есть хорошее изображение, но теперь я должен обработать 32-битные изображения с разрешением 2048 * 2048 пикселей, поэтому через некоторое время выполнение замедляется. Я постараюсь выяснить, почему.

0 голосов
/ 04 апреля 2019

Итак, хотя вы не говорите этого в вопросе, я предполагаю, что формат вашего изображения - 16-битная шкала серого.

Глядя на типы форматов здесь: https://doc.qt.io/Qt-5/qimage.html#Format-enum, это не поддерживаемый формат, поэтому вам придется изменить его на что-то, что можно отобразить.

Формат RGB64 допускает 16 бит на цвет, что является достаточным разрешением для значений, которые у вас есть:

from PySide import QtGui, QPixmap

def array_to_pixmap(arr):
    """Returns a QPixmap from a 16 bit greyscale image `arr`."""

    # create a local variable arr which is 64 bit so we can left shift it
    # without overflowing the 16 bit original array
    arr = arr.astype(np.int64)

    # pack the 16 bit values of arr into the red, green, and blue channels
    rgb = arr << 48 | arr << 32 | arr << 16 | 0xffff
    im = QtGui.QImage(rgb, rgb.shape[0], rgb.shape[1], QtGui.QImage.Format_RGBA64)
    return QtGui.QPixmap.fromImage(im)

Я не проверял это, но он должен дать вам достаточно информации для продолжения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...