dhash-vips 0.0.2.0 → 0.0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/dhash-vips.rb +17 -10
- data/lib/dhash-vips/version.rb +1 -1
- data/spec/_spec.rb +24 -17
- 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: e1493f450019e00cceb6c31ce3d36addc04dc4e3
|
4
|
+
data.tar.gz: 5a0ae28a8c5d48ce59e46b0306e8b3d786ae64c2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 54e3a2b45b2040ffd30a0618850c173996c27e0d26fbe1495633b96ebb70586c426a3e0a9bc1e8f1403bd8c06d620eb9cb234cf84b5922a968eb2c69b0fec3a8
|
7
|
+
data.tar.gz: 9a26b10786c5db24093b1b9934d2a48bbc77bc7e31c780e70898f8be6816803b4a9ab817139abc243c8c7782e0a8973474e27f35fe64c4283742af8db34bcd6b
|
data/lib/dhash-vips.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require_relative "dhash-vips/version"
|
2
2
|
require "vips"
|
3
|
+
require "mll"
|
3
4
|
|
4
5
|
module DHashVips
|
5
6
|
module DHash
|
@@ -22,7 +23,7 @@ module DHashVips
|
|
22
23
|
def calculate file, hash_size = 8, kernel = nil
|
23
24
|
image = pixelate file, hash_size, kernel
|
24
25
|
|
25
|
-
image.cast("int").conv([1, -1]).crop(1, 0,
|
26
|
+
image.cast("int").conv([1, -1]).crop(1, 0, hash_size, hash_size).>(0)./(255).cast("uchar").to_a.join.to_i(2)
|
26
27
|
end
|
27
28
|
|
28
29
|
end
|
@@ -31,10 +32,10 @@ module DHashVips
|
|
31
32
|
extend self
|
32
33
|
|
33
34
|
def hamming a, b
|
34
|
-
ad = a >>
|
35
|
-
ai = a - (ad <<
|
36
|
-
bd = b >>
|
37
|
-
bi = b - (bd <<
|
35
|
+
ad = a >> 128
|
36
|
+
ai = a - (ad << 128)
|
37
|
+
bd = b >> 128
|
38
|
+
bi = b - (bd << 128)
|
38
39
|
((ai | bi) & (ad ^ bd)).to_s(2).count "1"
|
39
40
|
end
|
40
41
|
|
@@ -60,12 +61,18 @@ module DHashVips
|
|
60
61
|
|
61
62
|
def calculate file, hash_size = 8
|
62
63
|
image = Vips::Image.new_from_file file
|
63
|
-
image = image.resize(
|
64
|
+
image = image.resize(hash_size.fdiv(image.width), vscale: hash_size.fdiv(image.height)).colourspace("b-w")
|
64
65
|
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
66
|
+
array = image.to_a.map &:flatten
|
67
|
+
d1, i1, d2, i2 = [array, array.transpose].flat_map do |a|
|
68
|
+
d = MLL::subtract[a, a.rotate(1)].to_a.map &:to_a
|
69
|
+
m = median d.flatten.map(&:abs).sort
|
70
|
+
[
|
71
|
+
d.flatten.map{ |c| c < 0 ? 1 : 0 }.join.to_i(2),
|
72
|
+
d.flatten.map{ |c| c.abs >= m ? 1 : 0 }.join.to_i(2),
|
73
|
+
]
|
74
|
+
end
|
75
|
+
(((((d1 << 64) + d2) << 64) + i1) << 64) + i2
|
69
76
|
end
|
70
77
|
|
71
78
|
end
|
data/lib/dhash-vips/version.rb
CHANGED
data/spec/_spec.rb
CHANGED
@@ -1,21 +1,28 @@
|
|
1
1
|
require "dhash-vips"
|
2
2
|
|
3
|
+
require "pp"
|
4
|
+
|
3
5
|
[
|
4
|
-
[DHashVips::DHash, 17, 18, 22],
|
5
|
-
# [[0, 17, 29, 27, 22, 29],
|
6
|
-
# [17, 0, 30, 26, 33, 36],
|
7
|
-
# [29, 30, 0, 18, 39, 30],
|
8
|
-
# [27, 26, 18, 0, 35, 30],
|
9
|
-
# [22, 33, 39, 35, 0, 17],
|
10
|
-
# [29, 36, 30, 30, 17, 0]
|
11
|
-
[
|
12
|
-
#
|
13
|
-
|
14
|
-
#
|
15
|
-
# [
|
16
|
-
# [
|
17
|
-
# [
|
18
|
-
|
6
|
+
[DHashVips::DHash, 17, 18, 22, 39],
|
7
|
+
# [[0, 17, 29, 27, 22, 29, 30, 29],
|
8
|
+
# [17, 0, 30, 26, 33, 36, 37, 36],
|
9
|
+
# [29, 30, 0, 18, 39, 30, 39, 36],
|
10
|
+
# [27, 26, 18, 0, 35, 30, 35, 34],
|
11
|
+
# [22, 33, 39, 35, 0, 17, 28, 23],
|
12
|
+
# [29, 36, 30, 30, 17, 0, 33, 30],
|
13
|
+
# [30, 37, 39, 35, 28, 33, 0, 5],
|
14
|
+
# [29, 36, 36, 34, 23, 30, 5, 0]]
|
15
|
+
[DHashVips::IDHash, 15, 23, 28, 64],
|
16
|
+
# [[0, 16, 30, 32, 46, 58, 43, 43],
|
17
|
+
# [16, 0, 28, 28, 47, 59, 46, 47],
|
18
|
+
# [30, 28, 0, 15, 53, 49, 53, 52],
|
19
|
+
# [32, 28, 15, 0, 56, 53, 61, 64],
|
20
|
+
# [46, 47, 53, 56, 0, 23, 43, 45],
|
21
|
+
# [58, 59, 49, 53, 23, 0, 44, 44],
|
22
|
+
# [43, 46, 53, 61, 43, 44, 0, 0],
|
23
|
+
# [43, 47, 52, 64, 45, 44, 0, 0]]
|
24
|
+
# [DHashVips::IDHash, 14, 14, 21],
|
25
|
+
].each do |lib, min_similar, max_similar, min_not_similar, max_not_similar|
|
19
26
|
|
20
27
|
describe lib do
|
21
28
|
|
@@ -69,7 +76,7 @@ describe lib do
|
|
69
76
|
when (j - i).abs == 1 && (i + j - 1) % 4 == 0
|
70
77
|
if [i, j] == [hashes.size - 2, hashes.size - 1]
|
71
78
|
if described_class == DHashVips::DHash
|
72
|
-
expect(table[i][j]).to be
|
79
|
+
expect(table[i][j]).to be == 5
|
73
80
|
else
|
74
81
|
expect(table[i][j]).to eq 0
|
75
82
|
end
|
@@ -77,7 +84,7 @@ describe lib do
|
|
77
84
|
expect(table[i][j]).to be_between(min_similar, max_similar).inclusive
|
78
85
|
end
|
79
86
|
else
|
80
|
-
expect(table[i][j]).to
|
87
|
+
expect(table[i][j]).to be_between(min_not_similar, max_not_similar).inclusive
|
81
88
|
end
|
82
89
|
end
|
83
90
|
|