dhash-vips 0.0.3.2 → 0.0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Rakefile +6 -6
- data/lib/dhash-vips.rb +15 -15
- data/lib/dhash-vips/version.rb +1 -1
- data/spec/_spec.rb +4 -4
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: bb131dc947f50e6d428a75c6518704b6797e1d30
|
|
4
|
+
data.tar.gz: 63dc5d70626192321675dbfeaa020c31812095ac
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 8d1129484277dfcb2630aba294fdc2b2443017836376b556842a7d0faacbb4d4f77ef9e4e5f82653a32946c815c550182e26dd61b60f3c61a49fb589d539aa12
|
|
7
|
+
data.tar.gz: 8ca92c6b85bf56415ea5c3be928c93141fb8b4d3d733845843699ee028103e5416b0fe2520fb23817d9ee9596fad4dea3764d08d0a1c0edd79a47a047572949b
|
data/Rakefile
CHANGED
|
@@ -56,7 +56,7 @@ task :compare_matrixes do |_|
|
|
|
56
56
|
require "dhash"
|
|
57
57
|
require_relative "lib/dhash-vips"
|
|
58
58
|
require "mll"
|
|
59
|
-
[Dhash, DHashVips::DHash, DHashVips::IDHash].each do |m|
|
|
59
|
+
[[Dhash, :hamming], [DHashVips::DHash, :hamming], [DHashVips::IDHash, :distance]].each do |m, dm|
|
|
60
60
|
hashes = %w{
|
|
61
61
|
71662d4d4029a3b41d47d5baf681ab9a.jpg
|
|
62
62
|
ad8a37f872956666c3077a3e9e737984.jpg
|
|
@@ -67,7 +67,7 @@ task :compare_matrixes do |_|
|
|
|
67
67
|
df0a3b93e9412536ee8a11255f974141.jpg
|
|
68
68
|
679634ff89a31279a39f03e278bc9a01.jpg
|
|
69
69
|
}.map{ |filename| m.calculate "images/#{filename}" }
|
|
70
|
-
table = MLL::table[m.method(
|
|
70
|
+
table = MLL::table[m.method(dm), [hashes], [hashes]]
|
|
71
71
|
array = Array.new(4){ [] }
|
|
72
72
|
hashes.size.times.to_a.repeated_combination(2) do |i, j|
|
|
73
73
|
array[i == j ? 0 : (j - i).abs == 1 && (i + j - 1) % 4 == 0 ? [i, j] == [0, 1] ? 1 : 2 : 3].push table[i][j]
|
|
@@ -82,7 +82,7 @@ task :compare_images do |_|
|
|
|
82
82
|
abort "there should be two image filenames passed as arguments" unless ARGV.size == 3
|
|
83
83
|
require_relative "lib/dhash-vips"
|
|
84
84
|
ha, hb = ARGV.drop(1).map &DHashVips::IDHash.method(:calculate)
|
|
85
|
-
puts "distance: #{DHashVips::IDHash.
|
|
85
|
+
puts "distance: #{DHashVips::IDHash.distance ha, hb}"
|
|
86
86
|
|
|
87
87
|
require "delegate"
|
|
88
88
|
class ImageMutable < SimpleDelegator
|
|
@@ -178,12 +178,12 @@ task :compare_speed do
|
|
|
178
178
|
end
|
|
179
179
|
end
|
|
180
180
|
end
|
|
181
|
-
puts "
|
|
181
|
+
puts "distance (1000 times):"
|
|
182
182
|
Benchmark.bm 18 do |bm|
|
|
183
|
-
[Dhash, DHashVips::DHash, DHashVips::IDHash].zip(hashes) do |m, hs|
|
|
183
|
+
[[Dhash, :hamming], [DHashVips::DHash, :hamming], [DHashVips::IDHash, :distance]].zip(hashes) do |(m, dm), hs|
|
|
184
184
|
bm.report m do
|
|
185
185
|
hs.product hs do |h1, h2|
|
|
186
|
-
1000.times{ m.
|
|
186
|
+
1000.times{ m.send dm, h1, h2 }
|
|
187
187
|
end
|
|
188
188
|
end
|
|
189
189
|
end
|
data/lib/dhash-vips.rb
CHANGED
|
@@ -31,12 +31,12 @@ module DHashVips
|
|
|
31
31
|
module IDHash
|
|
32
32
|
extend self
|
|
33
33
|
|
|
34
|
-
def
|
|
34
|
+
def distance a, b
|
|
35
35
|
# TODO: the hash_size=8 is hardcoded here
|
|
36
36
|
((a | b) & (a >> 128 ^ b >> 128)).to_s(2).count "1"
|
|
37
37
|
end
|
|
38
38
|
|
|
39
|
-
|
|
39
|
+
@@median = lambda do |array|
|
|
40
40
|
h = array.size / 2
|
|
41
41
|
return array[h] if array[h] != array[h - 1]
|
|
42
42
|
right = array.dup
|
|
@@ -46,15 +46,15 @@ module DHashVips
|
|
|
46
46
|
return right.uniq[1] if left.count(left.last) > right.count(right.first)
|
|
47
47
|
left.last
|
|
48
48
|
end
|
|
49
|
-
fail unless 2 == median
|
|
50
|
-
fail unless 3 == median
|
|
51
|
-
fail unless 3 == median
|
|
52
|
-
fail unless 2 == median
|
|
53
|
-
fail unless 2 == median
|
|
54
|
-
fail unless 2 == median
|
|
55
|
-
fail unless 3 == median
|
|
56
|
-
fail unless 1 == median
|
|
57
|
-
fail unless 1 == median
|
|
49
|
+
fail unless 2 == @@median[[1, 2, 2, 2, 2, 2, 3]]
|
|
50
|
+
fail unless 3 == @@median[[1, 2, 2, 2, 2, 3, 3]]
|
|
51
|
+
fail unless 3 == @@median[[1, 1, 2, 2, 3, 3, 3]]
|
|
52
|
+
fail unless 2 == @@median[[1, 1, 1, 2, 3, 3, 3]]
|
|
53
|
+
fail unless 2 == @@median[[1, 1, 2, 2, 2, 2, 3]]
|
|
54
|
+
fail unless 2 == @@median[[1, 2, 2, 2, 2, 3]]
|
|
55
|
+
fail unless 3 == @@median[[1, 2, 2, 3, 3, 3]]
|
|
56
|
+
fail unless 1 == @@median[[1, 1, 1]]
|
|
57
|
+
fail unless 1 == @@median[[1, 1]]
|
|
58
58
|
|
|
59
59
|
def calculate file, hash_size = 8
|
|
60
60
|
image = Vips::Image.new_from_file file
|
|
@@ -62,11 +62,11 @@ module DHashVips
|
|
|
62
62
|
|
|
63
63
|
array = image.to_a.map &:flatten
|
|
64
64
|
d1, i1, d2, i2 = [array, array.transpose].flat_map do |a|
|
|
65
|
-
d = MLL::subtract[a, a.rotate(1)].to_a.
|
|
66
|
-
m = median d.
|
|
65
|
+
d = MLL::subtract[a, a.rotate(1)].to_a.flat_map(&:to_a)
|
|
66
|
+
m = @@median.call d.map(&:abs).sort
|
|
67
67
|
[
|
|
68
|
-
d.
|
|
69
|
-
d.
|
|
68
|
+
d.map{ |c| c < 0 ? 1 : 0 }.join.to_i(2),
|
|
69
|
+
d.map{ |c| c.abs >= m ? 1 : 0 }.join.to_i(2),
|
|
70
70
|
]
|
|
71
71
|
end
|
|
72
72
|
(((((d1 << hash_size * hash_size) + d2) << hash_size * hash_size) + i1) << hash_size * hash_size) + i2
|
data/lib/dhash-vips/version.rb
CHANGED
data/spec/_spec.rb
CHANGED
|
@@ -3,7 +3,7 @@ require "dhash-vips"
|
|
|
3
3
|
require "pp"
|
|
4
4
|
|
|
5
5
|
[
|
|
6
|
-
[DHashVips::DHash, 17, 18, 22, 39],
|
|
6
|
+
[DHashVips::DHash, :hamming, 17, 18, 22, 39],
|
|
7
7
|
# [[0, 17, 29, 27, 22, 29, 30, 29],
|
|
8
8
|
# [17, 0, 30, 26, 33, 36, 37, 36],
|
|
9
9
|
# [29, 30, 0, 18, 39, 30, 39, 36],
|
|
@@ -12,7 +12,7 @@ require "pp"
|
|
|
12
12
|
# [29, 36, 30, 30, 17, 0, 33, 30],
|
|
13
13
|
# [30, 37, 39, 35, 28, 33, 0, 5],
|
|
14
14
|
# [29, 36, 36, 34, 23, 30, 5, 0]]
|
|
15
|
-
[DHashVips::IDHash, 15, 23, 28, 64],
|
|
15
|
+
[DHashVips::IDHash, :distance, 15, 23, 28, 64],
|
|
16
16
|
# [[0, 16, 30, 32, 46, 58, 43, 43],
|
|
17
17
|
# [16, 0, 28, 28, 47, 59, 46, 47],
|
|
18
18
|
# [30, 28, 0, 15, 53, 49, 53, 52],
|
|
@@ -22,7 +22,7 @@ require "pp"
|
|
|
22
22
|
# [43, 46, 53, 61, 43, 44, 0, 0],
|
|
23
23
|
# [43, 47, 52, 64, 45, 44, 0, 0]]
|
|
24
24
|
# [DHashVips::IDHash, 14, 14, 21],
|
|
25
|
-
].each do |lib, min_similar, max_similar, min_not_similar, max_not_similar|
|
|
25
|
+
].each do |lib, dm, min_similar, max_similar, min_not_similar, max_not_similar|
|
|
26
26
|
|
|
27
27
|
describe lib do
|
|
28
28
|
|
|
@@ -62,7 +62,7 @@ describe lib do
|
|
|
62
62
|
end
|
|
63
63
|
|
|
64
64
|
hashes = [*images, bw1, bw2].map &described_class.method(:calculate)
|
|
65
|
-
table = MLL::table[described_class.method(
|
|
65
|
+
table = MLL::table[described_class.method(dm), [hashes], [hashes]]
|
|
66
66
|
|
|
67
67
|
# require "pp"
|
|
68
68
|
# pp table
|