使用显微镜对大样本进行全片扫描并导出图片是一个很常见的需求,但是导出的图片往往会非常大,动辄是几个Gb的大小,常规的看图软件根本无法打开,更别提对它进行后续的编辑操作了。
那么要想在R中处理这种图片似乎也是一个更加难办的问题了,最大的问题是内存不足,其次在读入图片后,也会需要较高的CPU运算力来进行大图片的运算。
不过现在有一个可行的解决方案,那就是使用RBioFormats。这个包是R通过rJava的接口调用的Java工具包BioFormats进行的图片处理。由于需要和java做交互,所以这里的环境搭建和包安装就会有坑,本文后面会详述。
大多数情况下,生物全片扫描的图片导出的都是tiff格式,确切说是ome-tiff格式,这种图片格式是一个层次结构,保存了同一张图片的多个分辨率的备份,实际处理时,根据机器的性能,可以将合适的分辨率读入到R中。
RBioFormats依赖rJava,rJava需要本机安装java。
安装java
请注意下载之后,要配置好java是可用的状态,一般是需要配置环境变量PATH和JAVA_HOME。可以自行百度。验证方法就是在命令行中键入“java -version”, 如果正确返回了java的版本就代表java可以使用。
安装rJava
使用R的常规安装方法安装即可:install.packages('rJava')。
安装RBioFormats
RBioFormats的https://github.com/aoles/RBioFormats/tree/Bio-Formats_6.10.1。建议大家的安装方式是手动安装,先下载安装包,然后源码安装。
下载安装包
https://github.com/aoles/RBioFormats/archive/refs/tags/Bio-Formats_6.1.0.tar.gz
安装RBioFormats
一定要选择和Java一样的R版本,java是32位,R就选32位,java是64位,R就选64位。源码安装的时候,第一个参数是刚才下载的安装包的路径, type = "source"代表源码安装。
记得一定要加INSTALL_opts = "--no-multiarch",不然R默认会32和64位都安装,但是由于java的版本不同,会导致安装失败。
install.packages("RBioFormats-Bio-Formats_6.1.0.tar.gz", repos = NULL, type = "source", INSTALL_opts = "--no-multiarch")
另外RBioFormats是基于EBImage包构建的,所以也需要依赖EBImage,如果没有安装请先安装。
使用的注意事项
我的机器上rJava默认的内存大概500Mb,在做大图片读入时,明显太小了,可以设置内存大小,但是必须如下方式处理,比如设置rJava最大可用内存为10G:
必须在载入rJava前先设置好内存限制,如果已经载入了rJava,则内存设置无效,重新将rJava做library处理也不行,必须重新启动R。
载入RBioFormats前必须先载入rJava,不能让RBioFormats自动载入rJava,否则内存限制也不会生效,需要重新启动R。
options(java.parameters = '-Xmx10g')
library(rJava)
library(RBioFormats)
可以通过如下命令查看rJava的可用内存是多少,如下可以看到可用内存是9000+Mb。
RBioFormats::checkJavaMemory()
[1] 9102.5
如何导入ome-tiff
由于omr-tiff非常大,载入图片之前,应该先使用read.metadata先读取一下meta信息,看一下图片包括几个分辨率,每个分辨率的图片是多大。
如下所示,分辨率res为6时,图片大小是1024*1024的,这个分辨率的图片一般机器读取都没有问题。
ome_pic <- "tissue-pic/pic.ome.tiff" # <- 自己的ome-tiff文件路径
RBioFormats::read.metadata(ome_pic)
# ImageMetadata list of length 8
#
# series res sizeX sizeY sizeC sizeZ sizeT total
# 1 1 32768 32768 3 1 1 3
# 1 2 16384 16384 3 1 1 3
# 1 3 8192 8192 3 1 1 3
# 1 4 4096 4096 3 1 1 3
# 1 5 2048 2048 3 1 1 3
# 1 6 1024 1024 3 1 1 3
# 1 7 512 512 3 1 1 3
# 1 8 256 256 3 1 1 3
然后使用read.image读入图片
image <- RBioFormats::read.image(ome_pic, res = 6)
这个图片是基于EBImage的Image对象进行封装的图片对象AnnotatedImage,所以兼容EBImage包的各种图形操作。
可以通过EBImage的display进行展示,由于图片太暗,可以提高一下亮度:
EBImage::display(image)
# 提高亮度
EBImage::display(image * 5)
参考:
OME-TIFF: https://docs.openmicroscopy.org/ome-files-cpp/0.5.0/ome-model/manual/html/ome-tiff/specification.html
RBioFormats: https://github.com/aoles/RBioFormats