我正在使用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
和这个:
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
所以现在我正在寻找一种以正确的方式显示图像的方式。您是否知道我在做什么错?
谢谢
编辑
这里是arr的一个例子。命令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位数组ID的方式如下:
arr = numpy.around(arr*(2^8-1)/(2^16-1))
arr_uint8 = arr.astype(numpy.uint8)
如果我使用matplotlib.pyplot.imshow(arr, cmap='gray')
显示图像,则该图像可以正常工作,并且在编辑器中像这样显示图像:
但是当我将其转换为QPixmap时,结果与以前相同。
奇怪的是,当我使用arr_uint8 = arr.view(dtype=numpy.uint8)
转换为8位时,结果是2048 * 4096而不是2048 * 2048的数组。我不明白为什么...
答案 0 :(得分:0)
因此,尽管您在问题中未提及,但我将假定您的图像格式为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)
我还没有测试过,但是它应该可以给您足够的信息。
答案 1 :(得分:0)
我找到了解决方案。实际上,@ user545424的解决方案不起作用,因为我使用的是PyQt5,并且不支持图像格式Format_RGBA64。我尝试安装PySide2,但没有成功,因此经过一番研究,我发现了这篇文章:Convert 16-bit grayscale to 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
此代码有效,我有一个不错的图像,但是现在我必须处理2048 * 2048像素的32位图像,因此一段时间后执行速度会变慢。我将尝试找出原因。