dhash-vips 0.0.3.2 → 0.0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|