代码之家  ›  专栏  ›  技术社区  ›  D Greenwood

在R中只打开图像的一部分(JPEG/TIFF等)

  •  0
  • D Greenwood  · 技术社区  · 6 年前

    我正在分析R中的非常大的图像,以几万像素平方的顺序排列。不幸的是,即使使用64GB的RAM,这些映像有时也无法装入内存,当它们装入内存时,我一次只能打开一个映像,从而排除了并行化。

    我目前的策略是使用JPEG或TIFF包加载它们。例如。:

    image <- readJPEG('image.jpg')

    但是,由于我只执行可以逐个执行的简单数学操作(求和、阈值等),是否可以通过指定要加载的维度一次只打开图像的一部分?如果是,我可以写一个循环来打开1024x 1024大小的平铺。JPEG和TIFF包不提供这样做的选项。

    2 回复  |  直到 6 年前
        1
  •  2
  •   Mark Setchell    6 年前

    如果你正在处理非常大的图像, libvips 可能是你最好的选择。你可以从 R 使用 system() .

    你的问题不是很具体,但是让我们用 图像魔术

    convert -size 10000x10000 gradient: -depth 8 a.tif
    

    现在以50%的门槛 vips 并检查所需内存:

    vips im_thresh a.tif b.tif 128 --vips-leak
    memory: high-water mark 292.21 MB
    

    图像魔术 命令需要1.6GB的RAM:

    /usr/bin/time -l convert a.tif -threshold 50% b.tif
    

    样本输出

    ...
    1603895296  maximum resident set size
    ...
    

    使用 im_gadd 其中:

    usage: vips im_gadd a in1 b in2 c out
    where:
        a is of type "double"
        in1 is of type "image"
        b is of type "double"
        in2 is of type "image"
        c is of type "double"
        out is of type "image"
    calculate a*in1 + b*in2 + c = outfile
    

    所以我们使用:

    vips im_gadd 1 a.tif 0 b.tif 64 c.tif --vips-leak
    memory: high-water mark 584.41 MB
    

    vips im_stats c.tif
    band    minimum     maximum         sum       sum^2        mean   deviation
    all          64         319   1.915e+10 4.20922e+12       191.5     73.6206
     1           64         319   1.915e+10 4.20922e+12       191.5     73.6206
    
        2
  •  0
  •   D Greenwood    6 年前

    结果是,有一个R包- RBioFormats

    source("https://bioconductor.org/biocLite.R")
    biocLite("aoles/RBioFormats") # You might need to first run `install.packages("devtools")`
    library(RBioFormats)
    

    无需打开图像,即可从元数据中读取图像的维度:

    metadata <- read.metadata('image.tiff')
    xdim <- metadata@.Data[[1]]$sizeX
    ydim <- metadata@.Data[[1]]$sizeY
    

    假设我们要加载左上角的512 x 512像素,我们使用 subset 功能:

    image <- read.image('image.tiff', subset = list(X = 1:512, y = 1:512))
    

    因此,编写循环以迭代方式处理整个大型图像是很简单的。R BioFormats是Java生物格式库的一个R接口,它将打开tiff、PNGs、jpeg以及许多专有的图像格式。