读取多个 *.gif 图像时的快速性能
fast performance when reading multiple *.gif images
我的电脑(i5-6500 3.2 GHZ,8 GB RAM)需要很长时间:大约 10 分钟(尚未准确测量)。
我目前必须
阅读 400 张图片。 (*.gif格式,应为黑白,分辨率约200*400像素)(共3520张图片)
我想"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。它是一个简单的矩阵加法。
测试图片:
- 读取光栅需要 0.03699994 秒
- 光栅读取 + as.matrix 需要:0.201 秒
你需要测量...没有任何样本图像很难说,我们只能猜测。您需要考虑到 loading/decoding JPG 需要几毫秒的时间,并且 GIF 的编码甚至 200 ms
.取决于编码类型。要加快 GIF 编码,您可以:
使用单一全局调色板 + 抖动
GIF 是 8 bpp
而 JPG 是 24 bpp
所以你的编码器需要做转换。这称为颜色量化,是编码时最昂贵的操作,在优化良好的 C++[=75] 机器中平均每帧 ~200 ms
PC =] 代码。有关详细信息,请参阅:
- Effective gif/image color quantization?
要解决这个问题,您可以使用专用于抖动的单一调色板(如默认 VGA 或使用一些 WEB 调色板,它们具有相同的用途) 并使用抖动要快得多。参见:
顺便说一句,如果您需要保留颜色,请看一下:
所以试着找出如何配置你的编码器来强制抖动而不是基于K-means或类似的颜色量化....
限制编码字典小于4096
encoding/decoding基于创建字典和编码需要在每个像素的基础上多次搜索它。因此,将其大小设置为 1024
可以显着提高速度。当然,您需要访问编码代码来更改此设置,除非可以以某种方式在其中进行配置...然而,压缩将因此减少,并且流中将出现更清晰的代码。
使用多线程
您可以将其完全并行化并使用系统中存在的每个内核进行编码。
我强烈建议你测量编码单帧GIF需要多长时间。如果你利用两个项目符号 #1,#2 那么我估计你可以接近每帧 ~5 ms
抖动和 ~60 ms
每帧快速量化。因此,对于 3520
帧,编码 GIF 大约需要 17.6
或 211.2
秒,因此添加文件内存和 JPG 操纵并考虑到所有内容都是严重的 guessed/estimated 因为您没有提供样本数据。如果您使用 #3 +/-
共享磁盘访问等待,则除以内核数。
我的电脑(i5-6500 3.2 GHZ,8 GB RAM)需要很长时间:大约 10 分钟(尚未准确测量)。
我目前必须
阅读 400 张图片。 (*.gif格式,应为黑白,分辨率约200*400像素)(共3520张图片)
我想"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。它是一个简单的矩阵加法。
测试图片:
- 读取光栅需要 0.03699994 秒
- 光栅读取 + as.matrix 需要:0.201 秒
你需要测量...没有任何样本图像很难说,我们只能猜测。您需要考虑到 loading/decoding JPG 需要几毫秒的时间,并且 GIF 的编码甚至 200 ms
.取决于编码类型。要加快 GIF 编码,您可以:
使用单一全局调色板 + 抖动
GIF 是
8 bpp
而 JPG 是24 bpp
所以你的编码器需要做转换。这称为颜色量化,是编码时最昂贵的操作,在优化良好的 C++[=75] 机器中平均每帧~200 ms
PC =] 代码。有关详细信息,请参阅:- Effective gif/image color quantization?
要解决这个问题,您可以使用专用于抖动的单一调色板(如默认 VGA 或使用一些 WEB 调色板,它们具有相同的用途) 并使用抖动要快得多。参见:
顺便说一句,如果您需要保留颜色,请看一下:
所以试着找出如何配置你的编码器来强制抖动而不是基于K-means或类似的颜色量化....
限制编码字典小于
4096
encoding/decoding基于创建字典和编码需要在每个像素的基础上多次搜索它。因此,将其大小设置为
1024
可以显着提高速度。当然,您需要访问编码代码来更改此设置,除非可以以某种方式在其中进行配置...然而,压缩将因此减少,并且流中将出现更清晰的代码。使用多线程
您可以将其完全并行化并使用系统中存在的每个内核进行编码。
我强烈建议你测量编码单帧GIF需要多长时间。如果你利用两个项目符号 #1,#2 那么我估计你可以接近每帧 ~5 ms
抖动和 ~60 ms
每帧快速量化。因此,对于 3520
帧,编码 GIF 大约需要 17.6
或 211.2
秒,因此添加文件内存和 JPG 操纵并考虑到所有内容都是严重的 guessed/estimated 因为您没有提供样本数据。如果您使用 #3 +/-
共享磁盘访问等待,则除以内核数。