SVS文件是什么?

最开始拿到SVS文件一脸懵逼的,这货长这样(在windows下可以用Aperio ImageScope这个开源软件打开):

我现在接触的这种图片的大小一般在60M-1.5G之间,可以将图片放大到20倍左右,上面的这张图片来自于网站https://openslide.org/demo/,支持网页在线查看,有兴趣小伙伴可以去这个网站看看。当图片放大到最大分辨率时,可以看到组织里面的每一个细胞,可以说真的非常高清了。

SVS文件如何转存成通用格式(保持高分辨率)?这里以上面链接里面的 CMU-1-JP2K-33005.svs 文件为例,文件大小为:132.6M

我首先想到了opencv,因为图片处理这一块opencv比较方便。但是令我想不到的是,opencv竟然读取的时候就出错了“ cv2.error: OpenCV(3.4.2) /io/opencv/modules/imgcodecs/src/loadsave.cpp:74: error: (-215:Assertion failed) pixels <= (1<<30) in function 'validateInputImageSize' ”,说明svs文件大小超出范围,于是我只能换其他方法。

然后我google了很多方法(注:以下很多网站都得FQ...):

1. OpenSlide(openslide-python):https://openslide.org/

OpenSlide这是一个开源C库,有python的接口,很好用。具体的openslide的使用,大家可以自行百度,这里有一个不错的链接:https://blog.csdn.net/weixin_41787032/article/details/79817926

不得不说,openslide对于病理图片的切片处理还是很不错的,但是要想把保存整张高分辨率图片,我很惊讶地发现,图片的大小以倍数增加(使用tiff格式存储,大概扩大了十倍,但是如果以jpg格式的话,图片确实会很小,但是是属于有损压缩,这里并没有选择。话说png也是个不错的选择),因为我取的是 level=0下的dimensions,这样可以保持图片的最大分辨率,但是与此同时,如果图片再大一点或者电脑的性能略低的话,电脑就有可能卡死,或者报MemoryError的错误,于是我放弃了继续使用openslide。下面是我的代码,很简单:


  1. import openslide

  2. import numpy as np

  3. import scipy.misc

  4. test = openslide.open_slide('test.svs')

  5. img = np.array(test.read_region((0, 0), 0, test.dimensions))

  6. scipy.misc.imsave('test.tif', img)

2. libvips(pyvips): http://jcupitt.github.io/libvips/API/current/Examples.md.html

libvips也是一个C库,但是也有python接口,叫pyvips,使用方法请查看官方文档:https://libvips.github.io/pyvips/

这个方法有点无脑了,直接读取然后存储,一点儿都不拖泥带水。但是问题是,存储后的图片大小变得特别大,但是不会出现存储不了的情况,也就是不会出现内存错误之类的现象而导致存储失败。下面是我的代码:


  1. import pyvips

  2. img = pyvips.Image.new_from_file('test.svs', access='sequential')

  3. img.write_to_file('test.tif')

3. reaConverter(windows软件,支持命令行批量操作)

这是一款windos下的软件,可以支持多种格式的图片自动转换,这是链接:https://www.reaconverter.com/convert/svs_to_tiff.html。问题是,转换过后的图片大小依然非常大,而且转换时间很长,每一样都是我所不能接受的。而且,软件也是付费的,伤不起。。。(软件长这个样子)

其实,对于svs文件的高分辨率存储,我现在也还是没有太好的解决办法。我现在所能存储的结果都是,文件变得特别大,这样对于存储以及后续的处理都非常麻烦,所以我们研究了一下,还是决定对svs文件进行切片处理,然后进行识别等一系列操作,存储这一环节就被省略掉了。如果大家有什么好的建议不妨探讨一下;

SVS文件的显示

这里我就直接说方法了,也就是很牛掰的Deep Zoom。微软有一个软件叫做DeepZoomComposer,原理和这个一样,可以实现将一张高清大图分成好几个分辨率下的小图,并且小图是由一张张小的切片组成的,下面是这种图片的效果(左边是缩略图,右边是最大分辨率下眼睛部位的图片):

既然这么牛掰的技术,python肯定也会有相应的api的。有很多库都支持deep zoom,像:openslide,py_wsi,pyvips等等,不过这里我还是要用pyvips,不为什么,只是因为简单无脑。。。下面是将svs文件转换成dzi文件格式保存:


  1. import pyvips

  2. img = pyvips.Image.new_from_file('test.svs', access='sequential')

  3. img.dzsave('test')

执行以上代码后,会生成两份文件,分别是:test.dzi,test_files,前者是单个文件,后者是一个文件夹,里面存储了svs文件不同分辨率下的切片,test.dzi里面的文件内容如下:


  1. <?xml version="1.0" encoding="UTF-8"?>

  2. <Image xmlns="http://schemas.microsoft.com/deepzoom/2008"

  3. Format="jpeg"

  4. Overlap="1"

  5. TileSize="254"

  6. >

  7. <Size

  8. Height="32893"

  9. Width="46000"

  10. />

  11. </Image>

要想将dzi文件展示出来,有一个java库叫做OpenSeaDragon(https://openseadragon.github.io/examples/tilesource-dzi/),将OpenSeaDragon下载下来并解压放在任何一个你喜欢的本地文件夹中,重命名为:openseadragon。此外还需要一个html文件(源自:https://blog.csdn.net/qianqianyixiao1/article/details/50420398),这里起名为test.html,内容如下:


  1. <!DOCTYPE html>

  2. <html lang='en'>

  3. <head>

  4. <meta charset='UTF-8'>

  5. <title>OpenSeadragon_Demo0</title>

  6. <script src='../openseadragon.min.js'></script>

  7. </head>

  8. <body>

  9. <div id='openSeadragon1' style='width:1850px; height:960px;'></div>

  10. </body>

  11. <script type='text/javascript'>

  12. OpenSeadragon({

  13. id: 'openSeadragon1',

  14. prefixUrl: '../images/',

  15. tileSources: {

  16. Image: {

  17. xmlns: 'http://schemas.microsoft.com/deepzoom/2008',

  18. Url: './test_files/',

  19. Overlap: '1',

  20. TileSize: '254',

  21. Format: 'jpeg',

  22. Size: {

  23. Height: '32893',

  24. Width: '46000'

  25. }

  26. }

  27. }

  28. });

  29. </script>

  30. </html>

记得将里面的数据替换成dzi文件里面的数据,然后就可以将test.dzi文件删除了。然后将test.html和test_files文件夹置于同一目录(这里我的目录起名为:zoomFiles)下,然后放入到openseadragon文件夹中(下图所示),然后你就可以点击test.html文件,在网页里就能得到显示对应的结果了(如下图所示,最后一张为文件存放规则)。

python医学病理图片svs装换的更多相关文章

  1. canvas和图片之间的互相装换

    canvas和图片之间的互相装换 一.总结 一句话总结:一个是canvas的drawImage方法,一个是canvas的toDataURL方法 canvas drawImage() Image对象 c ...

  2. python txt装换成excel

    工作中,我们需要经常吧一些导出的数据文件,例如sql查出来的结果装换成excel,用文件发送.这次为大家带上python装换excel的脚本 记得先安装wlwt模块,适用版本,python2-3 #c ...

  3. C# DataSet装换为泛型集合

    1.DataSet装换为泛型集合(注意T实体的属性其字段类型与dataset字段类型一一对应) #region DataSet装换为泛型集合 /// <summary> /// 利用反射和 ...

  4. oracle中的装换函数

    日期装换成字符的函数:TO_CHAR(date[,fmt[,params]]) 默认格式:DD-MON-RR 参数说明: date:将要装换的日期 fmt:装换的格式 params:日期的语言(可以不 ...

  5. opencv之深拷贝及浅拷贝,IplImage装换为Mat

    一.(1)  浅拷贝: Mat B; B = image  // 第一种方式 Mat C(image); // 第二种方式 这两种方式称为浅copy,是由于它们有不同的矩阵头,但是它们共享内存空间,即 ...

  6. python 将png图片格式转换生成gif动画

    先看知乎上面的一个连接 用Python写过哪些[脑洞大开]的小工具? https://www.zhihu.com/question/33646570/answer/157806339 这个哥们通过爬气 ...

  7. Python人工智能之图片识别,Python3一行代码实现图片文字识别

    1.Python人工智能之图片识别,Python3一行代码实现图片文字识别 2.tesseract-ocr安装包和中文语言包 注意:

  8. java json和对象互相装换

    java json和对象互相装换 1.com.alibaba.fastjson.JSON 2.com.fasterxml.jackson.databind.ObjectMapper

  9. Map 与 JavaBean 的相互装换

    目的 为了方便使用 DbUtils,在插入数据时需要传入含有占位符的 SQL 语句和对应占位符的值(数组),封装代码如下: /** * 插入实体 */ public static <T> ...

  10. Python批量修改图片格式和尺寸

    Python批量修改图片格式和尺寸 备注: 1.导入了PIL库,是处理图片用的,很强大; 2.导入了的win32库,是判断隐藏文件用的,我们的项目需要删除隐藏文件,不需要的可以直接找到删除. 3.导入 ...

随机推荐

  1. 【python】第二模块 步骤一 第一课、MySQL的介绍

    第一课.MySQL的介绍 一.课程介绍 1.1 课程介绍 学习目标 了解关系型数据库的重要性 为什么会出现关系型数据库? 有哪些常见的关系型数据库? 掌握MySQL的安装和配置 怎么安装MySQL数据 ...

  2. springboot pom文件引入本地jar包

    记录maven引用本地jar包 配置 及打包的其中一个方法,作为个人笔记,供参考: <dependency> <groupId>gdin</groupId> < ...

  3. 页面与java后台之 上传文件与服务器加载

    添加相关依赖包commons-fileupload等: 页面(注:编码enctype="multipart/form-data"   文件按钮属性multiple) java    ...

  4. 11.30linux学习第十一天

    今天老刘上课,第7章收尾,第8章开了个头. 7.1.3  磁盘阵列+备份盘 RAID 10磁盘阵列中最多允许50%的硬盘设备发生故障,但是存在这样一种极端情况,即同一RAID 1磁盘阵列中的硬盘设备若 ...

  5. [Leetcode 111]二叉树的最短深度 BFS/DFS

    题目 给定二叉树,求最短路径包含的节点个数 https://leetcode.com/problems/minimum-depth-of-binary-tree/ Given a binary tre ...

  6. 狂神的学习笔记demo04

    package com.company; public class demo04 { public static void main(String[] args){ int i=10;//二进制 in ...

  7. java map重写 转大写、转驼峰

    /** * @author admin * @Description * 转大写 */ public class HashMapUpper<V> extends HashMap<St ...

  8. 基于工业4g网关的危化品运输车监控方案

    工业的发展立足于各种各样原材料的加工和应用,而其中就包括一些油料.化学品和易燃易爆货物,针对此类货物的运输,需要着重关注其安全性和稳定性,否则就容易造成严重的人身和财产损失.得益于物联网技术的发展,现 ...

  9. Docker部署【项目管理和问题跟踪工具-Redmine】

    创建网络 docker network create redmine-network 启动Mysql数据库 docker run -d --name mysql --network redmine-n ...

  10. idea导入数据库

    yml文件(在启动项文件(main)里,eg:springbook文件里面) sh-bean里org.example.sh.beans的Category类   CategoryDAO名字要和Categ ...