读取多个 *.gif 图像时的快速性能

fast performance when reading multiple *.gif images

我的电脑(i5-6500 3.2 GHZ,8 GB RAM)需要很长时间:大约 10 分钟(尚未准确测量)。

我目前必须

  1. 阅读 400 张图片。 (*.gif格式,应为黑白,分辨率约200*400像素)(共3520张图片)

  2. 我想"add"所有图片"cell-wise"。

我现在是这样做的:用 raster 读取图像,然后将其转换为 matrix,然后 sum

library(rgdal)
library(raster)
library(magrittr)

oldPic <- raster("initalImage.gif") %>% as.matrix

for (pat_IND in currSide) {
    newPic <- raster(pat_IND) %>% as.matrix
    oldPic <- oldPic + newPic
}

这需要永远。我使用了 caTools::read.gif() 甚至更慢。我的代码中有瓶颈吗?有没有更快的实现?

编辑:图像属性

我使用 "no dither",单色调色板(黑白)。

编辑2

我想按像素添加图像。来张图A和图B吧

A + B = C。如果A(1,1) = 1且B(1,1) = 1,则C(1,1)应为2。它是一个简单的矩阵加法。

测试图片:

  1. 读取光栅需要 0.03699994 秒
  2. 光栅读取 + as.matrix 需要:0.201 秒

你需要测量...没有任何样本图像很难说,我们只能猜测。您需要考虑到 loading/decoding JPG 需要几毫秒的时间,并且 GIF 的编码甚至 200 ms.取决于编码类型。要加快 GIF 编码,您可以:

  1. 使用单一全局调色板 + 抖动

    GIF8 bppJPG24 bpp 所以你的编码器需要做转换。这称为颜色量化,是编码时最昂贵的操作,在优化良好的 C++[=75] 机器中平均每帧 ~200 ms PC =] 代码。有关详细信息,请参阅:

    • Effective gif/image color quantization?

    要解决这个问题,您可以使用专用于抖动的单一调色板(如默认 VGA 或使用一些 WEB 调色板,它们具有相同的用途) 并使用抖动要快得多。参见:

    顺便说一句,如果您需要保留颜色,请看一下:

    所以试着找出如何配置你的编码器来强制抖动而不是基于K-means或类似的颜色量化....

  2. 限制编码字典小于4096

    encoding/decoding基于创建字典和编码需要在每个像素的基础上多次搜索它。因此,将其大小设置为 1024 可以显着提高速度。当然,您需要访问编码代码来更改此设置,除非可以以某种方式在其中进行配置...然而,压缩将因此减少,并且流中将出现更清晰的代码。

  3. 使用多线程

    您可以将其完全并行化并使用系统中存在的每个内核进行编码。

我强烈建议你测量编码单帧GIF需要多长时间。如果你利用两个项目符号 #1,#2 那么我估计你可以接近每帧 ~5 ms 抖动和 ~60 ms 每帧快速量化。因此,对于 3520 帧,编码 GIF 大约需要 17.6211.2 秒,因此添加文件内存和 JPG 操纵并考虑到所有内容都是严重的 guessed/estimated 因为您没有提供样本数据。如果您使用 #3 +/- 共享磁盘访问等待,则除以内核数。