- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个用例,我想交叉比较 2 组图像以了解最相似的对。
但是,集合很大,出于性能目的,我不想一直打开和关闭图像。
所以我的想法是:
std::map<int, Magic::Image> set1;
for(...) { set1[...] = Magic::Image(...);}
std::map<int, int> best;
for(...) {
set2 = Magic::Image(...);
//Compare with all the set1
...
best[...] = set1[...]->first;
}
很明显,我不需要存储所有第 2 组,因为我是逐张处理图像。但无论如何 set1 已经太大了,存储 32 位图像太多了。供引用:15000 张图片,300x300 = 5GB
我想通过将图像降采样为单色来减少内存(这不会影响我的用例)。但是怎么做呢?即使我得到一个颜色 channel ,Image-Magick 仍然威胁新图像为 32 位,即使它只是一个 channel 。
我的 final方法是编写一个自解析器,逐个读取颜色、转换它并创建一个位 vector 。然后做 XOR 和计数位。这样可行。 (仅使用 170 MB)
但是,并不灵活。如果我想在某个时候使用 2 位或 8 位怎么办?是否有可能以任何方式使用 Imagemagick 自己的类并调用 compare()
?
谢谢!
最佳答案
我有几个建议 - 也许可以给您一些建议!
建议1
也许您可以使用感知哈希。您无需将所有图像保存在内存中,而是一次为每张图像计算一个哈希值,然后比较哈希值之间的距离。
一些 PHASHes 对图像缩放具有不变性(或者您可以在散列之前将所有图像缩放到相同的大小)并且大多数对图像格式具有不变性。
这是 Neal Krawetz 博士的一篇文章... Perceptual Hashing .
ImageMagick 还可以执行感知散列并且可以从 PHP 调用 - 参见 here .
前段时间我也为这类事情写了一些代码... code.
建议2
我知道 ImageMagick 第 7 版即将推出 - 不知道谁能告诉你更多 - 它支持真正的单 channel 、灰度图像 - 以及多达 32 channel 的多光谱图像。我相信它也可以充当服务器——在内存中保存图像以供后续使用。也许这会有所帮助。
建议3
也许您可以从 GNU Parallel 中获得一些好处 - 它可以让您的所有 CPU 内核并行忙碌,并且还可以使用 ssh
在多个服务器上分配工作。那里有很多教程和示例,但只是为了演示将一组命名图像 (a、b、c、d) 中的每一项与一组编号图像 (1,2) 中的每一项进行比较,您可以这样做:
parallel -k echo {#} compare {1} {2} ::: a b c d ::: 1 2
输出
1 compare a 1
2 compare a 2
3 compare b 1
4 compare b 2
5 compare c 1
6 compare c 2
7 compare d 1
8 compare d 2
显然,我已经将 echo
放在那里,因此您可以看到生成的命令,但您可以删除它并实际运行 compare
。
因此,您的代码可能看起来更像这样:
#!/bin/bash
# Create a bash function that GNU Parallel can call to compare two images
comparethem() {
result=$(convert -metric rmse "$1" "$2" -compare -format "%[distortion]" info:)
echo Job:$3 $1 vs $2 $result
}
export -f comparethem
# Next line effectively uses all cores in parallel to compare pairs of images
parallel comparethem {1} {2} {#} ::: set1/*.png ::: set2/*.png
输出
Job:3 set1/s1i1.png vs set2/s2i3.png 0.410088
Job:4 set1/s1i1.png vs set2/s2i4.png 0.408234
Job:6 set1/s1i2.png vs set2/s2i2.png 0.406902
Job:7 set1/s1i2.png vs set2/s2i3.png 0.408173
Job:8 set1/s1i2.png vs set2/s2i4.png 0.407242
Job:5 set1/s1i2.png vs set2/s2i1.png 0.408123
Job:2 set1/s1i1.png vs set2/s2i2.png 0.408835
Job:1 set1/s1i1.png vs set2/s2i1.png 0.408979
Job:9 set1/s1i3.png vs set2/s2i1.png 0.409011
Job:10 set1/s1i3.png vs set2/s2i2.png 0.407391
Job:11 set1/s1i3.png vs set2/s2i3.png 0.408614
Job:12 set1/s1i3.png vs set2/s2i4.png 0.408228
建议3
我不久前写了一篇关于使用 REDIS 缓存图像的回答 - 它也可以在小型服务器池中以分布式方式工作。那个答案是here .
建议4
您可能会发现,将第二组图像转换为 Magick Pixel Cache 格式可以获得更好的性能,这样它们就可以通过 DMA 存储到内存中,而不是每次都需要解码和解压缩。所以你会这样做:
convert image.png image.mpc
它为您提供了 ImageMagick 可以非常快速读取的这两个文件。
-rw-r--r-- 1 mark staff 856 16 Jan 12:13 image.mpc
-rw------- 1 mark staff 80000 16 Jan 12:13 image.cache
请注意,我并不是建议您以 MPC 格式永久存储图像,因为它是 ImageMagick 独有的并且可以在不同版本之间更改。我建议您在每次运行分析之前生成该格式的拷贝。
关于c++ - Imagemagick C++ : Reducing memory usage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34791778/
我不知道如何从 reducerRegister.js 中的 reducerForm.js reducer 访问 bool 值 isLoading 标志。我使用了 combineReducers() 并
我正在尝试找到一种理想的方法来更新我的状态树上的几个顶级字段,同时仍然维护拆分 reducer 。 这是我想出的一个简单的解决方案。 var state = { fileOrder: [0],
如果我们想按相同的键(第一个 reducer 的输出)分组,是否可以将 reducer 的输出直接发送到另一个 reducer 有时在链接时我发现我正在使用一个映射器来读取输入并将其复制到输出。因此想
我有一个如下所示的 reducer : const chart = combineReducers({ data, fetchProgress, fetchError,
当Map Reduce代码中有多个reduce时,它们之间没有任何形式的通信。但是,当执行诸如聚合之类的操作时,所有化简器共同产生单个最终输出。当它们之间没有通信时,聚合如何发生?是通过写入上下文吗?
我在 hive 中有一个表,我想从中获取所有数据。问题是: select * from tbl; 给我的结果与以下情况截然不同: select count(*) from tbl; 这是为什么?第二个
假设我有一个带有两个 reducer 的应用程序 - 使用 combineReducers() 组合的 tables 和 footer。 当我点击某个按钮时,将分派(dispatch)两个操作 - 一
我正在学习更深入的 redux,并且在处理高阶 reducer 时遇到一些麻烦。 我试图使用一个简单的分页示例来了解它是如何工作的。 NB:下面的代码只是 Nodejs 上下文中 redux 的一个快
我调用 RSS 提要并使用解析器对其进行解析。我收到一个数组。我现在想在最后创建一个对象,看起来像这样: { "2019-06-13": { "rates": { "usd":
我有一份学生列表,我的应用程序始终显示当时的一个学生,即 activePupil。到目前为止我有两个 reducer 。其中一个包含并默认返回所有子项的列表(以数组的形式): [ { id:
我有一个叫做 animals 的特征缩减器(切片缩减器)。我想将这些 reducer 拆分为哺乳动物、鸟类、鱼类等。这部分很简单,因为我可以简单地使用 ActionReducerMap。 现在假设哺乳
空数组上的简单reduce会抛出: 线程“main”java.lang.UnsupportedOperationException 中的异常:无法减少空的可迭代对象。 链接时同样的异常: val a
我有一些 25k 文档(原始 json 中为 4 GB)的数据,我想对其执行一些 javascript 操作,以使我的最终数据使用者 (R) 更容易访问这些数据,并且我想通过为每个更改添加一个新集合来
我只是想验证我对这些参数及其关系的理解,如果我错了请通知我。 mapreduce.reduce.shuffle.input.buffer.percent 告诉分配给 reducer 的整个洗牌阶段的内
我想将 redux 状态的值从 reducer 传递到另一个 reducer。在我的例子中,我想将 groups 的值从 groupReducer.js 中的状态传递到 scheduleReducer
所以,我有一个应用程序,它有多个 reducer ,因此有多个关联的 Action 创建者。 有一段时间,我的一个 reducer 更新了状态(由于编辑),因此,我必须确保其他 reducer 看到此
我有一个 reducer ,可以在调度操作时重新调整适当的状态。现在我定期调用 API,因此结果会一次又一次地触发操作。所以我想要的是,如果 reducer 状态已经有数据,那么另一个 reducer
当我尝试执行来自 here 的 DISTINCT reduce 时,出现错误。我已经在啤酒 sample 桶上重现了这个错误,所以这应该很容易重现。我没有在 mapreduce_errors.txt
在以下语法的简单优先级解析(分解)中,我们存在 shift-reduce 和 reduce-reduce 冲突。 X 是开始符号,X'-->$X$ 是添加规则。另外+和下符号是终结符。 X'-->$X
我需要编写一个连续调用两个reducer的Mapreduce程序。即,第一个 reducer 的输出将是第二个 reducer 的输入。我如何实现这一目标? 到目前为止我发现的内容表明我需要在我的驱动
我是一名优秀的程序员,十分优秀!