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