【问题标题】:Antialiasing images in pyqtgraph ImageViewpyqtgraph ImageView中的抗锯齿图像
【发布时间】:2022-04-22 11:30:58
【问题描述】:

我正在使用 PyQtGraph 并且非常喜欢它,但是遇到了一个可能迫使我转向其他东西的问题。

我在 ImageView 中将医学图像(CT/MRI 等)显示为 numpy 2D 或 3D 数组,这为体积数据提供了漂亮的滑块视图。问题是这些图像通常是低分辨率 (256x256),当在大型显示器上查看或只是放大时,它们看起来像块状和可怕的。

如何显示这些图像抗锯齿?如此处所述,这似乎是可能的: How can anti-aliasing be enabled in a pyqtgraph ImageView?

还有一些其他地方建议您需要做的就是:

import pyqtgraph as pg
pg.setConfigOptions(antialias=True)

并在图形视图中启用抗锯齿,我假设是这样的:

myImageViewWidget = pg.ImageView(parent=None)
myImageViewWidget.ui.graphicsView.setAntialiasing(True)

但这在我的代码中似乎没有什么不同。我做错了什么?

我使用的是 Windows 10(但需要它在 MacOs - Darwin 上运行)、Python 3.7、PySide 2 (5.15.12) 和 PyQtGraph 0.12.3

重现问题的“最小”代码(不完全是,但我想保留 ImageView 的子类,因为这就是我在代码中的方式):

import sys
from PySide2.QtWidgets import (
    QApplication,
    QHBoxLayout,
    QMainWindow,
    QWidget,
)
import pyqtgraph as pg
import numpy as np

pg.setConfigOptions(antialias=True)


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        self.cw = QWidget(self)
        self.cw.setAutoFillBackground(True)
        self.setCentralWidget(self.cw)

        self.layout = QHBoxLayout()
        self.cw.setLayout(self.layout)

        self.ImgWidget = MyImageWidget(parent=self)
        self.layout.addWidget(self.ImgWidget)

        self.show()


class MyImageWidget(pg.ImageView):
    def __init__(self, parent=None):
        super().__init__(parent)

        self.ui.histogram.hide()
        self.ui.roiBtn.hide()
        self.ui.menuBtn.hide()
        self.ui.graphicsView.setAntialiasing(True)

        # 5 frames of 50x50 random noise
        img = (1000 * np.random.normal(size=(5, 50, 50))) - 500
        self.setImage(img)


def main():
    app = QApplication()
    main = MainWindow()
    main.show()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

【问题讨论】:

    标签: python pyside2 pyqtgraph


    【解决方案1】:

    你指的不是抗锯齿。

    Antialiasing“平滑”图像中不能精确“适合”单个物理像素的部分。

    您所看到的实际上是相反的,因为每个源像素实际上都足够大,可以按原样显示:一个可能占据 更多 个物理像素的正方形。

    您可能想要的是模糊效果,可以通过在视图的self.imageItem 上设置QGraphicsBlurEffect 来实现:

    class MyImageWidget(pg.ImageView):
        def __init__(self, parent=None):
            # ...
            self.blurEffect = QGraphicsBlurEffect(blurRadius=1.1)
            self.imageItem.setGraphicsEffect(self.blurEffect)
    

    请注意,由于图像项始终按比例缩放并且模糊效果成比例,因此您可能需要根据显示的分辨率将模糊半径调整为更小的值(但仍大于1.0)。

    【讨论】:

    • 也很有趣-我想我会(应该)使缩放变得动态-当屏幕分辨率匹配或低于显示的图像分辨率时将其关闭,或者我错过了什么?显然 Qt 图形不是我的强项。
    • @OliN 是的,您可能应该检查图像的 可见 大小是否至少是源大小的两倍,但最重要的方面是 做到这一点:使用默认行为,您应该使用在 resizeEvent() 中启动的延迟单次计时器来做到这一点(调整视图大小时场景不会立即缩放),但如果您还需要交互控制缩放,那么您需要进一步挖掘 pyqtgraph 源代码。
    猜你喜欢
    • 2017-03-09
    • 1970-01-01
    • 1970-01-01
    • 2020-03-25
    • 2016-04-24
    • 2015-05-21
    • 1970-01-01
    • 2014-02-18
    • 2021-02-12
    相关资源
    最近更新 更多