问题描述
我想用pyside2开发一个病理图像识别工具,但是不知道如何显示整个幻灯片图像(后缀为.svs),就像ASAP的功能软件可以快速打开和显示图片。
解决方法
您可以使用返回 PIL.Image 的 OpenSlide read_region()
方法,该 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)