Показать вывод skimage в приложении qt

Я использую skimage для некоторых манипуляций с изображениями с помощью их манипуляций с numpy. Я могу посчитать свои пиксели, а затем показать результат, используя

def image_manip():
    # do manipulations
    return final_image
viewer = ImageViewer(image_manip())
viewer.show()

Параллельно в другом приложении я могу показать изображение в QT, используя:

self.pixmap = QtGui.QPixmap('ImagePath.jpg')

Так что в идеале я хотел бы объединить их во что-то вроде этого:

def image_manip():
    # do manipulations
    return final_image

self.pixmap = QtGui.QPixmap(image_manip())

Очевидно, это не работает. Я получаю сообщение об ошибке TypeError: QPixmap(): argument 1 has unexpected type 'numpy.ndarray'

Я предполагаю, что viewer = ImageViewer(image_manip()) и viewer.show() обладают некоторой магией, позволяющей напрямую читать объекты skimage/numpy. В моем случае использования я не хочу сохранять файл из skimage (я хочу просто сохранить его в памяти), поэтому я полагаю, что его нужно «выпечь», чтобы Qt мог читать его как общий формат.

Как мне это сделать?


person M Leonard    schedule 15.10.2017    source источник
comment
Возможный дубликат Преобразовать изображение Python Opencv (массив numpy) в Изображение PyQt QPixmap   -  person Imanol Luengo    schedule 15.10.2017


Ответы (1)


Вы можете преобразовать массив uint8 numpy (изображение формы M, N, 3 RGB) в QPixmap следующим образом:

from skimage import img_as_ubyte

arr = img_as_ubyte(arr)
img = QImage(arr.data, arr.shape[1], arr.shape[0],
             arr.strides[0], QImage.Format_RGB888)
pixmap = QPixmap.fromImage(img)
person Stefan van der Walt    schedule 15.10.2017
comment
В итоге я реализовал это немного по-другому, но да! Это работает! И что отличало ваш ответ от предложенного дублирующего ответа, так это img_as_ubyte ... в противном случае изображение было просто набором разноцветных пикселей :-) Спасибо! - person M Leonard; 15.10.2017