问题标签 [phash]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
3399 浏览

image - 如何知道图像是否与另一个图像相似(角度略有不同但观点相同)

我已经检查了像 Phasher 这样的方法来获得类似的图像。基本上将图像大小调整为 8x8,灰度,获取平均像素并创建每个像素的二进制哈希,比较它是否高于或低于平均像素。

这种方法在这里解释得很好: http ://hackerfactor.com/blog/index.php?/archives/432-Looks-Like-It.html

工作示例: - 桌子上计算机的图像 1 - 图像 2,相同,但带有硬币

在此处输入图像描述

这是可行的,因为使用非常缩小的灰度图像的散列,它们两者几乎相同,甚至相同。因此,当 90% 以上的像素相同(在同一个地方!)时,您可以得出结论它们是相似的

我的问题是从相同的角度但不同的角度拍摄的图像,例如:

在此处输入图像描述

在这种情况下,生成的哈希“指纹”相互偏移,以至于我们无法逐位比较哈希,这将是非常不同的。

像素是“相似的”,但它们不在同一个地方,因为在这种情况下,天空更多,房屋“开始”比第一个更低。

所以哈希比较结果是“它们是不同的图像”。

可能的解决方案:

我正在考虑为第一个图像创建一个更大的散列,然后为第二个图像获取 10 个随机“子散列”,并尝试查看 10 个子散列是否在第一个大散列的“某个地方”(如果一个子字符串包含在另一个更大的字符串中)。

我认为这里的问题是处理数千张图像时的 CPU/时间,因为您必须将 1 张图像与 1000 张图像进行比较,并且在每张图像中,将 10 个子哈希与一个大哈希进行比较。

其他解决方案?;-)

0 投票
1 回答
690 浏览

ruby - phash ruby​​,如何访问哈希

我目前正在结合 ruby​​ ( https://github.com/toy/pHash/blob/master/lib/phash.rb ) 使用phash ( http://www.phash.org )。

如果我使用所描述的示例,它会起作用。

但我只想提取哈希 - 但我不知道该怎么做

0 投票
1 回答
1821 浏览

matlab - 用于感知散列的matlab代码

我需要一个用于此处描述的感知散列算法的 matlab 代码: http ://www.hackerfactor.com/blog/index.php?/archives/432-Looks-Like-It.html

基本上我希望这可以删除图像中的细节,只留下主要结构组件信息。

为此,我认为我需要以下步骤: 1. 减少 DCT。假设 DCT 是 32x32(),只保留左上角的 8x8。这些代表图片中的最低频率。

  1. 计算平均值。与平均哈希一样,计算平均 DCT 值(仅使用 8x8 DCT 低频值并排除第一项,因为 DC 系数可能与其他值显着不同,并且会偏离平均值)。

  2. 进一步降低 DCT。根据 64 个 DCT 值中的每一个值是高于还是低于平均值,将 64 个哈希位设置为 0 或 1。结果并没有告诉我们实际的低频;它只是告诉我们频率与平均值的非常粗略的相对比例。只要图像的整体结构保持不变,结果就不会改变;这可以毫无问题地在伽马和颜色直方图调整中存活。

  3. 处理后重建图像。

任何人都可以帮助完成上述任何一个步骤吗?我已经尝试了一些给出一些结果的代码(在下面的链接中),它还不完美: https ://stackoverflow.com/questions/26748051/extract-low-frequency-from-dct-coeffecients-of-an- matlab 中的图像

0 投票
1 回答
201 浏览

ruby - 为 gem 使用环境变量(pHash)

我在 OSX 上,我已经安装了 pHash gem

使用 gem 时,出现以下错误:Could not open library 'libpHash.dylib'.

在文档中,作者说

您可以使用环境变量(如PHASH_LIB=/opt/local/lib/libpHash.dylib.

问题是我不知道如何在我的 ruby​​ 程序的上下文中实际调用这个环境变量。gem 是用 调用的require 'phash',但是我在哪里可以指定 ENV 变量?

0 投票
1 回答
3382 浏览

c++ - 未找到“initializer_list”文件

尝试为节点安装 phash-image 但我收到此错误:

我该如何解决?我在 os x 10.10.3 上并使用自制软件安装了 phash

0 投票
1 回答
1081 浏览

c++ - 找不到使用 MacPorts 安装的库

我已经使用 MacPorts 安装了 pHash 库,但是当我尝试编译示例源代码时出现此错误:

如何告诉源代码在哪里可以找到库?(根据我发现它们安装在 /opt/local 中)

0 投票
2 回答
1654 浏览

c++ - 在 Ubuntu 上安装 pHash 时出错

所以我试图在 Ubuntu 上安装 pHash 库。我已经安装了运行此命令所需的所有软件包:

然后我运行 ./configure ,一切似乎都很好,我得到了这个:

但是当我尝试 make 命令时,我得到了这些错误:

有些人可以帮助我理解有什么问题?

0 投票
1 回答
2712 浏览

python - 在 ImageHash Python 库中更改哈希大小

我正在使用ImageHash库来生成图像的感知散列。该库声称能够生成不同大小的散列(64、128、256),但我不知道如何获得 128 散列。

哈希大小由库重新缩放时的图像大小决定,例如:

这里的默认值为 8(8x8 图像 = 64 像素 -> 灰度 -> 64 位)。

但是,如何创建 128 位哈希?

第二件事,pHash 的默认大小是 32,正如这里所解释的,但稍后将仅计算左上角 8x8 部分的 DCT,因此再次为 64 位。DCT 通过以下方式计算scipy.fftpack

如何更改哈希大小?
无论使用哪个值,计算都将始终基于左上角的 8x8,因此始终为 64!

发生的奇怪事情是,如果我从 8 大小的 pHash 开始(从头调整图像大小),我得到了 56 位的最终哈希(即计算 7x8 图像的哈希:我不明白为什么这发生在DCT计算中——但我真的知道一点。

0 投票
2 回答
1624 浏览

c# - 将 intptr 转换为 ulong 数组

我正在从 C# 调用一个方法,如下所示:

这是我从图书馆调用的方法

如何ulong从 中读取数组IntPtr

0 投票
7 回答
11602 浏览

image - 在 Elasticsearch 中通过 pHash 距离搜索相似图像

相似图片搜索问题

  • 数百万张经过 pHash 处理的图像并存储在 Elasticsearch 中。
  • 格式为“11001101...11”(长度为 64),但可以更改(最好不要)。

给定主题图像的哈希“100111..10”,我们希望在8 的汉明距离内的 Elasticsearch 索引中找到所有相似的图像哈希。

当然query可以返回距离大于8的图片,Elasticsearch或者外部的脚本可以过滤结果集。但总搜索时间必须在 1 秒左右。

我们当前的映射

images每个文档都有包含图像哈希的嵌套字段:

我们糟糕的解决方案

事实: Elasticsearch 模糊查询仅支持最大 2 的 Levenshtein 距离。

我们使用自定义标记器将 64 位字符串拆分为 4 组 16 位,并使用四个模糊查询进行 4 组搜索。

分析仪:

然后是新的字段映射:

然后查询:

请注意,我们返回具有匹配图像的文档,而不是图像本身,但这不应该改变很多。

问题是即使在添加其他特定于域的过滤器以减少初始集之后,此查询也会返回数十万个结果。脚本有太多工作要再次计算汉明距离,因此查询可能需要几分钟。

正如预期的那样,如果增加到minimum_should_match3 和 4,则只返回必须找到的图像子集,但结果集小而快。低于 95% 的所需图像返回minimum_should_match== 3,但我们需要 100%(或 99.9%),如minimum_should_match== 2。

我们用 n-gram 尝试了类似的方法,但在太多结果的类似方式中仍然没有太大的成功。

其他数据结构和查询的任何解决方案?

编辑

我们注意到,我们的评估过程中有一个错误,minimum_should_match== 2 返回 100% 的结果。但是,之后的处理时间平均需要 5 秒。我们将看看脚本是否值得优化。