如何使用pyqt在场景中输出颜色贴图?

2024-04-30 22:36:13 发布

您现在位置:Python中文网/ 问答频道 /正文

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之间。 enter image description here

如何将此图像输出到Qt中的场景?您可以使用self.image = numpy.random.random((256, 256))来获得与我类似的起点。如何将随机值的2D numpy数组作为颜色贴图放到pyqt场景中?在


更新24/02/1016

如此接近。这似乎管用,但规模已经颠倒过来了。蓝色现在是热的,红色是冷的。我如何切换它,使它看起来像上面的图像?在

^{pr2}$

enter image description here

我尝试的是2016年2月23日

以下是一个空白屏幕

    scene = QGraphicsScene(self)
    scaled_image = Image.fromarray(np.uint8(self.image*255))
    pixMap = QPixmap(scaled_image)
    scene.addPixmap(pixMap)
    self.graphicsView.setScene(scene)

enter image description here

下面给我一个灰度输出到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)

enter image description here

我从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

enter image description here

如果我做了下面的事情,我会得到我想要的颜色图,比如我之前开发的一个web应用程序的图片

>>> fig = plt.figure()
>>> ax = fig.add_subplot(111)
>>> imgplot = ax.imshow(self.image)

enter image description here

如何在qt场景中添加一个颜色贴图,而不仅仅是灰度?在


Tags: 图像imageselfnumpy颜色np场景random
3条回答

你已经有了几乎可以工作的代码。您可以使用以下方法获得图像:

scaled_image = Image.fromarray(np.uint8(self.image*255))

要反转,只需从255减去当前数据。在

^{pr2}$

在这里,我假设您当前的代码是正确的,并且只有反转的值。但如果您的数据真的是从-1到1,那么当前代码将把结果的一半限制为零(因为uint8的最小值为零)。从-1到1的正确代码应该稍微修改一下:

scaled_image = Image.fromarray(255 - (self.image + 1)*127.5)

另外,您可以使用不同的颜色映射(例如'jet_r')而不需要任何数学运算就可以反转颜色。但是要确保你的值被正确地缩放

所以这起作用了。。。但我觉得这样做很肮脏:

    scene = QGraphicsScene(self)
    scaled_image = Image.fromarray(np.uint8(self.image*255))
    plt.savefig(".../Downloads/itworks.png")
    pixMap = QPixmap(".../Downloads/itworks.png")
    scene.addPixmap(pixMap)
    self.graphicsView.setScene(scene)

是否真的需要依赖于将图像保存到文件中,然后将其作为QPixmap重新加载才能工作。。。?这不是一个非常不和谐的管道胶带的答案,我认为这是一个相当标准的要求的pyqt?我担心每次都要将图像保存到文件中会在扩展时产生一个瓶颈,而且,由于我要管理文件系统的东西,所以会很烦人。在

我将悬赏留给任何人谁可以提供一种方法输出numpy.random.random((256, 256))到qt场景,而不需要保存到文件的中间步骤。在

同时,这种管道胶带解决方案可以:

enter image description here

更新:作为参考,这是我最后所做的,使用rbaleksandar和{a3}中的代码完美地工作。谢谢大家!在

^{pr2}$

QPixmap支持大于255和multiple image formats的颜色值。如果不是这样的话,Qt中的所有图标都是灰色的(显然不是这样;)。在

您可以以任何方式生成颜色映射(在使用OpenCV和numpy之前)或在将其转换为QImage(使用Qt)之后,将其转换为QPixmap并使用^{}(不要直接将QPixmap作为QGraphicScene的一部分)将其附加到您的QGraphicsScene。在

编辑: 我看错了文件。实际上,您可以通过使用addPixmap()在qgraphicsene中直接使用QPixmap。很抱歉。作为道歉,这里有一些代码给你。:P

import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *

class ImageView(QGraphicsView):
  def __init__(self, pixmap=None, parent=None):
    '''
    QGraphicsView shows the image
    '''
    super(ImageView, self).__init__(parent)
    self.pixmap = pixmap


class Widget(QWidget):
  def __init__(self, parent=None):
    super(Widget, self).__init__(parent)
    layout = QVBoxLayout(self)
    pic = QPixmap('/home/-----/Pictures/7 Cat Sins - Wrath.jpg')
    grview = ImageView(pic, self)
    layout.addWidget(grview)
    self.setFixedSize(pic.size())

    scene = QGraphicsScene(self)
    scene.addPixmap(pic)

    grview.setScene(scene)
    self.show()

def main():
  app = QApplication(sys.argv)
  w = Widget()

  return sys.exit(app.exec_())

if __name__ == '__main__':
  main()

结果如下:

enter image description here

图片来源:在谷歌上查找7个猫罪-愤怒

基本上,您可以创建一个图像查看器,创建场景图,向场景图添加一个pixmap,将图像查看器的场景设置为该图形,并使用该查看器在屏幕上显示pixmap。在

编辑2: 好吧,看来你对matplotlib的实际集成有问题。下面是您的方法(摘自here并对gcf().canvas.buffer_rgba()做了一点小改动):

^{pr2}$

编辑3: 对于反向颜色映射问题,请参见here (documentation)here (SO)。在

PS:我建议您不要使用额外的库,例如qimage2ndarray将OpenCV图像转换为QImage,我建议您自己这样做,看看到底需要做些什么。如果你对这些资料有丰富的经验,而且你只需要节省一些时间,这样的库就很整洁了。除此之外,离他们远点。在

相关问题 更多 >