【问题标题】:fast performance when reading multiple *.gif images读取多个 *.gif 图像时性能快速
【发布时间】:2017-09-05 14:44:43
【问题描述】:

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

我现在必须

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

  2. 我想“按单元格”“添加”所有图像。

这是我目前的做法:使用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(),它甚至更慢。我的代码有瓶颈吗?有更快的实现吗?

编辑:图像属性

我使用“无抖动”,单色板(黑白)。

编辑2

我想按像素添加图像。让我们来看看图片 A 和图片 B。

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

测试图片:

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

【问题讨论】:

  • 不确定...的时间是多少?#1 表示 GIF 的解码时间,#2 表示 GIF 的解码时间 + 从光栅到矩阵的转换?如果是,那么展位时间太大(比我的 GIF 加载器大 5 倍,可能没有很好地优化加载器)但看起来矩阵的东西是你的问题尝试自己编写转换...还要检查矩阵的数据类型如果它是浮点数,可能会出现问题,如果可以的话,请使用整数,这样你就不需要转换这么多......
  • 1.它读取 GIF 文件并创建光栅对象所需的时间。 “作为矩阵”使其慢 6 倍。

标签: r gif


【解决方案1】:

您需要测量...没有任何示例图像很难说,我们只能猜测。您需要考虑到加载/解码 JPG 需要以毫秒为单位的时间,并且即使 200 ms 编码 GIF 也可能很耗时。取决于编码的种类。要加快 GIF 编码,您可以:

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

    GIF8 bppJPG24 bpp,因此您的编码器需要进行转换。这被称为颜色量化,是编码时最昂贵的操作,在经过良好优化的 C++ 代码中,平均 PC 机器每帧甚至可以采用 ~200 ms。欲了解更多信息,请参阅:

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

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

    因此,请尝试了解如何配置您的编码器以强制抖动而不是基于 K-means 或类似的颜色量化......

  2. 将编码字典限制为小于4096

    编码/解码基于创建字典,编码需要在每个像素的基础上搜索不止一次。因此,将其大小设置为1024 可以显着提高速度。粗略地说,您需要访问编码代码来更改它,除非可以在其中以某种方式对其进行配置...但是压缩会因此而降低,并且流中将出现更清晰的代码。

  3. 使用多线程

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

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

【讨论】:

  • 感谢您的回答。我想我确实会尝试找到一种并行的方法。我的 gif 都是黑白索引,值为 0-black 和 1-white。我相信还有一个透明层。我相信 GIF 格式本身就是一个瓶颈。你能为黑白图像推荐一种“更快”的格式吗?所以我可以在下一个项目中使用它?
  • @AndreElrico with BW 颜色量化应该不是问题,但你应该用颜色选择器或其他东西检查它,这样你就没有接近白色的 128 种颜色和接近黑色的 128 种颜色。您还可以将颜色数设置为最小,我认为支持 1 bpp。 GIF 应该足够快,唯一的问题是如果你的实现是我不使用 GIF 的第 3 方库,因为我有自己的......但是你必须测量时间以确保在这种情况下可能是 JPG不好的选择,因为它不适合 BW 图像......如果你分享一些我可以测量的样本图像,那么你就有比较时间。
  • 没有 JPG。我在帖子中犯了一个错误。它们都是具有上述属性的 gif。我添加了图片属性的照片,这是“快速”格式吗?
  • @AndreElrico 是的,格式和配置看起来不错,至少共享一帧,这样我就可以测量它的加载速度。您可能会遇到另一个问题,因为您先创建矩阵然后对其求和...可能对您的内存而言太大并且涉及交换...此外,求和您的意思是创建单个图像或添加帧以产生动画?
  • 查看我关于“edit2”的问题。感谢您抽出宝贵时间!
猜你喜欢
  • 1970-01-01
  • 2018-01-25
  • 2014-02-16
  • 2016-11-16
  • 2010-11-14
  • 2012-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多