TL;DR:您只需阅读“更新”部分。在
How do you output
numpy.random.random((256, 256))
as a colormap to a qt scene?
这是总结。在
下面是我要保存到文件中的颜色贴图。在
scaled_image = Image.fromarray(np.uint8(self.image*255))
plt.savefig("/home/test.png")
self.image
是256x256 numpy数组,其所有值都在-1和1之间。
如何将此图像输出到Qt中的场景?您可以使用self.image = numpy.random.random((256, 256))
来获得与我类似的起点。如何将随机值的2D numpy数组作为颜色贴图放到pyqt场景中?在
如此接近。这似乎管用,但规模已经颠倒过来了。蓝色现在是热的,红色是冷的。我如何切换它,使它看起来像上面的图像?在
^{pr2}$以下是一个空白屏幕
scene = QGraphicsScene(self)
scaled_image = Image.fromarray(np.uint8(self.image*255))
pixMap = QPixmap(scaled_image)
scene.addPixmap(pixMap)
self.graphicsView.setScene(scene)
下面给我一个灰度输出到Qt场景。为什么不是彩色的?在
scene = QGraphicsScene(self)
scaled_image = Image.fromarray(np.uint8(self.image*255))
imgQ = ImageQt(scaled_image)
pixMap = QtGui.QPixmap.fromImage(imgQ)
scene.addPixmap(pixMap)
self.graphicsView.setScene(scene)
我从colormap问题的解决方案逆向工程here并显示图像here。在
根据发布的解决方案的建议,我尝试先创建一个QGraphicsPixmapItem
,然后将该项添加到场景中。官方文件有点混乱,所以我终于得到了我需要的东西。很遗憾我得到了和上面一样的灰度。代码如下:
scene = QGraphicsScene(self)
scaled_image = Image.fromarray(np.uint8(self.image*255))
imgQ = ImageQt(scaled_image)
pixMap = QtGui.QPixmap.fromImage(imgQ)
pixMapItem = QtGui.QGraphicsPixmapItem(pixMap)
scene.addItem(pixMapItem)
self.graphicsView.setScene(scene)
self.image
是numpy2d数组,它的所有值都在-1和1之间。在
我按如下方式缩放并得到灰度图像。不过,我想要一张彩色地图:
scene = QGraphicsScene(self)
scaled_image = (self.image + 1) * (255 / 2)
scene.addPixmap(QPixmap.fromImage(qimage2ndarray.array2qimage(scaled_image)))
self.graphicsView.setScene(scene)
#min(self.image) = -0.64462
#max(self.image) = 1.0
如果我做了下面的事情,我会得到我想要的颜色图,比如我之前开发的一个web应用程序的图片
>>> fig = plt.figure()
>>> ax = fig.add_subplot(111)
>>> imgplot = ax.imshow(self.image)
如何在qt场景中添加一个颜色贴图,而不仅仅是灰度?在
你已经有了几乎可以工作的代码。您可以使用以下方法获得图像:
要反转,只需从255减去当前数据。在
^{pr2}$在这里,我假设您当前的代码是正确的,并且只有反转的值。但如果您的数据真的是从-1到1,那么当前代码将把结果的一半限制为零(因为uint8的最小值为零)。从-1到1的正确代码应该稍微修改一下:
另外,您可以使用不同的颜色映射(例如
'jet_r'
)而不需要任何数学运算就可以反转颜色。但是要确保你的值被正确地缩放所以这起作用了。。。但我觉得这样做很肮脏:
是否真的需要依赖于将图像保存到文件中,然后将其作为QPixmap重新加载才能工作。。。?这不是一个非常不和谐的管道胶带的答案,我认为这是一个相当标准的要求的pyqt?我担心每次都要将图像保存到文件中会在扩展时产生一个瓶颈,而且,由于我要管理文件系统的东西,所以会很烦人。在
我将悬赏留给任何人谁可以提供一种方法输出
numpy.random.random((256, 256))
到qt场景,而不需要保存到文件的中间步骤。在同时,这种管道胶带解决方案可以:
更新:作为参考,这是我最后所做的,使用rbaleksandar和{a3}中的代码完美地工作。谢谢大家!在
^{pr2}$QPixmap
支持大于255和multiple image formats的颜色值。如果不是这样的话,Qt中的所有图标都是灰色的(显然不是这样;)。在您可以以任何方式生成颜色映射(在使用OpenCV和numpy之前)或在将其转换为
QImage
(使用Qt)之后,将其转换为QPixmap
并使用^{} (不要直接将将其附加到您的QPixmap
作为QGraphicScene
的一部分)QGraphicsScene
。在编辑: 我看错了文件。实际上,您可以通过使用
addPixmap()
在qgraphicsene中直接使用QPixmap
。很抱歉。作为道歉,这里有一些代码给你。:P结果如下:
图片来源:在谷歌上查找7个猫罪-愤怒)
基本上,您可以创建一个图像查看器,创建场景图,向场景图添加一个pixmap,将图像查看器的场景设置为该图形,并使用该查看器在屏幕上显示pixmap。在
编辑2: 好吧,看来你对
^{pr2}$matplotlib
的实际集成有问题。下面是您的方法(摘自here并对gcf().canvas.buffer_rgba()
做了一点小改动):编辑3: 对于反向颜色映射问题,请参见here (documentation)和here (SO)。在
PS:我建议您不要使用额外的库,例如
qimage2ndarray
将OpenCV图像转换为QImage
,我建议您自己这样做,看看到底需要做些什么。如果你对这些资料有丰富的经验,而且你只需要节省一些时间,这样的库就很整洁了。除此之外,离他们远点。在相关问题 更多 >
编程相关推荐