农村的师傅的博客

一个迫于生计,无法放飞自我,导致喜欢上了前端开发,并即将成长为强者(指头发)的程序猿。

0%

数字切片解析浏览

对于数字切片的业务来说,其实无非就是解析数字切片中包含的一些切片数据,比如切片信息,比如切片的瓦片图,而数字切片解析自然就是为了拿到这些数据了。

数字切片文件格式

请参照:数字切片文件格式了解文档,了解数字切片的包含哪些类型的数据信息。

数字切片的文件格式很多,有通用的svs、tiff,以及sdpc、kfb等各种私有格式,他们存储的信息类型都大同小异,私有格式可能会有一些额外信息以便业务的使用,但通用的信息,如切片的宽高、比例尺、瓦片图等等数据都是会有的。

文件都是有文件格式规范定义的,其实了解各种切片文件的文件格式,你就可以自己编写解析器去解析里面的数据了,或者使用其文件格式提供的sdk自然也是ok的。怎么方便怎么来。

ps:需要根据业务选择解析工具,大部分开源的工具都无法支持切片文件存储在远端,即切片存储的地方,和解析服务不在同一个服务器。这时候可能就需要想其他方案了,如果是对象存储,可以走磁盘挂载或者,自行编写支持远程解析的解析器。

这里例举一些数字切片相关的解析库,他们可以提供解析、获取切片瓦片图、缩略图、宏观图,甚至可以提供对数字切片进行截图的功能。

除此之外,如果你需要自行编写解析器,那么需要只能根据具体的切片格式规范去具体实现了,这里没有一个通用的方法。(不过可以参考我编写TIFF文件解析

数字切片浏览

数字切片本质上就是存储的图像信息,而数字切片最常见的使用场景就是指切片的浏览。而数字切片格式的设计,不管是数字切片的不同分辨率的图像还是数字切片的瓦片图,都能方便我们对数字切片的浏览。

当你能够对数字切片进行解析,获取到数字切片中的切片信息、瓦片图像的时候,此时你就可以创建你的解析服务来支持数字切片的浏览了。

数字切片浏览方式

可以参考上面说的demo,查看效果:https://openslide.org/demo/

我们知道数字切片的图像有两个特点:

  • 包含了从大到小的不同分辨率的同一图案的多个图像,也就是所谓的图像层级或者切片层级
  • 每个分辨率的图像,不管分辨率大小,都会被分为固定大小的瓦片图。

数字切片浏览的目的,或者说想要达到的效果,就是为了显微镜看切片时的体验一致,即放大倍数越小,所能显示的图像区域就多,但是看不清细节。放大倍数越大,所能显示的图像本身的区域就越少,但是能看看清该部分的细节。显微镜中浏览器细胞的玻片时,显微镜能看到的视野大小是固定的,最小倍数下看不清玻片细节,但是能看到的整个玻片的全貌。而大倍数下,能看到玻片很小的细节部分(即看到细胞的细节部分),但是,视野中只能显示玻片中很小一部分的内容。

而数组切片的两个特点就是为了实现该目的而进行设计选择的:用户浏览时,有两个维度,一个是用户想要浏览切片的倍数,一个是用户所浏览的区域。和显微镜下的浏览操作是一致的。

倍数

通常,这里指的倍数有两个意思:

  • 一个是扫描仪扫描扫描切片时的扫描倍数,也即是通常所说的这个数字切片是扫描的多少倍。数字切片中最大分辨率那一层级图像就是该倍数下扫描出来的图像大小。假设扫描仪是扫描20倍的数字切片,你可以理解为扫描仪扫出来的图像和你在显微镜下20倍看到的图像是一样大小的。因为扫描仪上拍摄图像的镜头和显微镜上的镜头可以理解为是一种事物。
  • 一个是在浏览数字切片时,浏览软件的放大倍数。

当用户浏览数字切片时,浏览软件会根据用户浏览的倍数,加载某一层适合该倍数的图像(这里有个阈值的概念),如果用户浏览1倍下的切片时,那么应该只需要加载分辨率最小的那张图像即可。而用户浏览20倍时,可能就要加载分辨率最大的那层图像了。

浏览区域

而除了浏览倍数,还有就是用户浏览的区域。这里的浏览区域就是指显示出数字切片的那个区域,所对应的就是显微镜中的视野区域。假设用户在20倍下浏览切片,此时加载的是最大分辨率的图像,和显微镜一样,倍数放大了,能浏览的真实图像区域其实变小了,而不管是显微镜浏览物理切片还是用电脑浏览数字切片,其浏览的切片视野都是有限的。

所以,当用户浏览20倍数字切片时,只需要加载该倍数下的那个分辨率图像中,出现在该视野下的那些瓦片图即可。好比电脑视野只有1000x1000的大小,而最大那个分辨率图像有10w*10w像素,在这个放大倍数下,电脑屏幕所能显示的视野大小(也代表图像大小)也只有1000x1000,所以你只需要加载其中视野所在的那1000x1000的图像即可。这也是数字切片的图像都用瓦片图的方式来组织的原因,方便加载大图像中的某一个区域的图像。

ps:为了和真实世界用显微镜浏览物理切片时保持一致,会对数字切片中的缩放倍数做一个校正,以便让电脑上的20倍和显微镜下的20倍保持一致。通常数字切片会有一个比例尺来作为校正参数。

当用户在某一个倍数下移动切片视野时,同样每次加载视野所包含的那片区域的瓦片图像即可(这里会有坐标系的概念,以确定当前视野所浏览的切片在图像的哪个位置)

浏览框架

通常web端有一些浏览器框架来帮我们实现上诉逻辑。

通常,类似的框架我们提供切片浏览的必要信息,比如切片的倍数,比例尺,切片中最大分辨率的图像的图像宽高,瓦片图的宽高等信息,他会自动计算在当前的倍数和当前浏览区域下,需要加载的图像:包括应该加载哪个一个分辨率下的图像,以及加载该图像下的哪些瓦片图。此时通过切片解析服务来加载某个切片的某一层级的某张瓦片图。

相关浏览库推荐:

  • openseadragon 这是目前来说,web端浏览数字切片最好的选择之一,他能够很简单的就创建出能让你看到效果的切片浏览页面,同时如果你有更复杂的自定义需求,他的API也能够大部分的满足你,这是专门为类似的高分辨率图像所编写的图像查看器
  • openlayers 这是另外一个具有类似强大功能的地图库,是的,它主要为web地图浏览所编写,但是它也能够兼容浏览类似的高分辨率图像。它的功能更加强大,且支持webgl等高级功能。自然,它也更加复杂。