【问题标题】:How show Whole-slide image (.svs) in PySide2如何在 PySide2 中显示整张幻灯片图像 (.svs)
【发布时间】:2021-05-09 07:31:24
【问题描述】:

想用pyside2开发一个病理图像识别工具,但是不知道如何显示整个幻灯片图像(后缀为.svs),就像ASAP的功能一样软件可以快速打开并显示图片。

【问题讨论】:

    标签: python pyside2 openslide


    【解决方案1】:

    您可以使用 OpenSlide read_region() 方法返回一个 PIL.Image,该 PIL.Image 可以使用 PIL.ImageQt 模块转换为 QImage。

    import sys
    from functools import cached_property
    
    from PySide2.QtGui import QImage, QPixmap, QGuiApplication
    from PySide2.QtWidgets import QApplication, QComboBox, QLabel, QVBoxLayout, QWidget
    import openslide
    from PIL.ImageQt import ImageQt
    
    
    class OpenSlideViewer(QWidget):
        def __init__(self, parent=None):
            super().__init__(parent)
    
            self._slide = None
    
            lay = QVBoxLayout(self)
            lay.addWidget(self.combo_level)
            lay.addWidget(self.label_slide)
    
            self.combo_level.currentIndexChanged.connect(self.handle_current_index_changed)
    
        @property
        def slide(self):
            return self._slide
    
        @cached_property
        def combo_level(self):
            return QComboBox()
    
        @cached_property
        def label_slide(self):
            return QLabel(scaledContents=True)
    
        def load(self, filename):
            self._slide = openslide.OpenSlide(filename)
            self.combo_level.clear()
            for level in range(self.slide.level_count):
                self.combo_level.addItem(f"level-{level}", level)
            self.combo_level.setCurrentIndex(0)
    
        def change_level(self, level):
            image = self.slide.read_region(
                (0, 0), level, self.slide.level_dimensions[level]
            )
            qimage = ImageQt(image)
            pixmap = QPixmap.fromImage(qimage)
            self.label_slide.setPixmap(pixmap)
    
        def handle_current_index_changed(self):
            level = self.combo_level.currentData()
            self.change_level(level)
    
    
    def main(args):
        app = QApplication(args)
    
        viewer = OpenSlideViewer()
        filename = "/path/of/filename.svs"
        viewer.load(filename)
        viewer.resize(640, 480)
        viewer.show()
    
        ret = app.exec_()
    
        sys.exit(ret)
    
    
    if __name__ == "__main__":
        main(sys.argv)
    

    【讨论】:

    • 我跑了你的代码,但是发现电脑内存不够(16g)。内存主要花在load方法上,这个方法非常耗时。 Python不能实现类似ASAP的快速打开功能(也用到openslide和QT)。
    • @coding 你说的尽快是什么意思?
    • 抱歉,回复晚了。 ASAP 可以立即打开。 SVS图片(大于900M),可以放大和缩小图片。它的 GitHub 链接是“github.com/computationalpathologygroup/ASAP”。希望能快速打开基于python的.svs图片,放大缩小。没有办法这样做。
    猜你喜欢
    • 2022-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-29
    • 1970-01-01
    • 2016-06-22
    相关资源
    最近更新 更多