pyqtgraph ImageView中的抗锯齿图像

Antialiasing images in pyqtgraph ImageView

我正在使用 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

'Minimum' 重现问题的代码(不完全是,但我想保留 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()

你指的不是抗锯齿。

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)。