grayphash 0.0.9 → 0.0.10
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.
- data/ext/grayphash/grayphash.cpp +65 -0
- data/ext/grayphash/histo.rb +56 -0
- metadata +3 -2
data/ext/grayphash/grayphash.cpp
CHANGED
@@ -106,6 +106,68 @@
|
|
106
106
|
x = (x + (x >> 4)) & m4;
|
107
107
|
return INT2NUM((x * h01)>>56);
|
108
108
|
}
|
109
|
+
|
110
|
+
extern "C" VALUE t_histogram(VALUE self, VALUE lfile, VALUE channel) {
|
111
|
+
Check_Type(lfile, T_STRING);
|
112
|
+
char* file = RSTRING_PTR(lfile);
|
113
|
+
|
114
|
+
const unsigned int ch = NUM2UINT(channel);
|
115
|
+
CImg<uint8_t> src;
|
116
|
+
src.load(file);
|
117
|
+
|
118
|
+
CImg<float> meanfilter(7,7,1,1,1);
|
119
|
+
CImg<float> img;
|
120
|
+
if (src.spectrum() == 3){
|
121
|
+
img = src.channel(ch).get_convolve(meanfilter);
|
122
|
+
} else if (src.spectrum() == 4){
|
123
|
+
int width = img.width();
|
124
|
+
int height = img.height();
|
125
|
+
int depth = img.depth();
|
126
|
+
img = src.crop(0,0,0,0,width-1,height-1,depth-1,2).channel(ch).get_convolve(meanfilter);
|
127
|
+
} else {
|
128
|
+
img = src.channel(0).get_convolve(meanfilter);
|
129
|
+
}
|
130
|
+
|
131
|
+
float total = img.width() * img.height();
|
132
|
+
VALUE result_hist = rb_ary_new2(256);
|
133
|
+
const CImg<float> hist = img.histogram(256);
|
134
|
+
cimg_forX(hist,pos) {
|
135
|
+
rb_ary_push(result_hist, rb_float_new(hist[pos] / total));
|
136
|
+
}
|
137
|
+
|
138
|
+
return result_hist;
|
139
|
+
}
|
140
|
+
|
141
|
+
|
142
|
+
extern "C" VALUE t_histogram4lumin(VALUE self, VALUE lfile) {
|
143
|
+
Check_Type(lfile, T_STRING);
|
144
|
+
char* file = RSTRING_PTR(lfile);
|
145
|
+
|
146
|
+
CImg<uint8_t> src;
|
147
|
+
src.load(file);
|
148
|
+
|
149
|
+
CImg<float> meanfilter(7,7,1,1,1);
|
150
|
+
CImg<float> img;
|
151
|
+
if (src.spectrum() == 3){
|
152
|
+
img = src.RGBtoYCbCr().channel(0).get_convolve(meanfilter);
|
153
|
+
} else if (src.spectrum() == 4){
|
154
|
+
int width = img.width();
|
155
|
+
int height = img.height();
|
156
|
+
int depth = img.depth();
|
157
|
+
img = src.crop(0,0,0,0,width-1,height-1,depth-1,2).RGBtoYCbCr().channel(0).get_convolve(meanfilter);
|
158
|
+
} else {
|
159
|
+
img = src.channel(0).get_convolve(meanfilter);
|
160
|
+
}
|
161
|
+
|
162
|
+
float total = img.width() * img.height();
|
163
|
+
VALUE result_hist = rb_ary_new2(256);
|
164
|
+
const CImg<float> hist = img.histogram(256);
|
165
|
+
cimg_forX(hist,pos) {
|
166
|
+
rb_ary_push(result_hist, rb_float_new(hist[pos] / total));
|
167
|
+
}
|
168
|
+
|
169
|
+
return result_hist;
|
170
|
+
}
|
109
171
|
|
110
172
|
|
111
173
|
VALUE Grayphash;
|
@@ -116,5 +178,8 @@
|
|
116
178
|
rb_define_method(Grayphash, "about", (ruby_method*) &t_about, 0);
|
117
179
|
rb_define_method(Grayphash, "phash", (ruby_method*) &t_phash, 1);
|
118
180
|
rb_define_method(Grayphash, "hamming", (ruby_method*) &t_hamming, 2);
|
181
|
+
rb_define_method(Grayphash, "histogram", (ruby_method*) &t_histogram, 2);
|
182
|
+
rb_define_method(Grayphash, "histogram", (ruby_method*) &t_histogram, 2);
|
183
|
+
rb_define_method(Grayphash, "histogram4lumin", (ruby_method*) &t_histogram4lumin, 1);
|
119
184
|
}
|
120
185
|
|
@@ -0,0 +1,56 @@
|
|
1
|
+
require './grayphash'
|
2
|
+
require 'pp'
|
3
|
+
|
4
|
+
include Grayphash
|
5
|
+
|
6
|
+
$start = 0
|
7
|
+
$degree = 10
|
8
|
+
|
9
|
+
def max_metric hist1, hist2
|
10
|
+
h1 = hist1.each_with_index.sort.reverse[$start,$degree]
|
11
|
+
h2 = hist2.each_with_index.sort.reverse[$start,$degree]
|
12
|
+
#pp h2
|
13
|
+
result = 0
|
14
|
+
[0, $degree-1].each do |i|
|
15
|
+
#[0, 255].each do |i|
|
16
|
+
#result += (hist1[i] - hist2[i]).abs.to_f # / (hist1[i] + hist2[i] + 1)
|
17
|
+
result += (h1[i][1] - h2[i][1]).abs.to_f / (h1[i][1] + h2[i][1] + 1) # это даёт хороший результат. Если расстояние меньше 0,02, то скорее всего мы попали в нужную картинку.
|
18
|
+
end
|
19
|
+
return result
|
20
|
+
end
|
21
|
+
|
22
|
+
def progress_max_metric hist1, hist2
|
23
|
+
h1 = hist1.each_with_index.sort.reverse[$start,$degree]
|
24
|
+
h2 = hist2.each_with_index.sort.reverse[$start,$degree]
|
25
|
+
#pp h2
|
26
|
+
result = 0
|
27
|
+
k = 1.0
|
28
|
+
[0, $degree-1].each do |i|
|
29
|
+
result += k.to_f * (h1[i][1] - h2[i][1]).abs.to_f / (h1[i][1] + h2[i][1] + 1)
|
30
|
+
k /= 2
|
31
|
+
end
|
32
|
+
return result
|
33
|
+
end
|
34
|
+
|
35
|
+
|
36
|
+
|
37
|
+
histos = { }
|
38
|
+
path = '../../../pics/rotate/'
|
39
|
+
Dir.foreach(path) do |entry|
|
40
|
+
next unless File.file? path+entry
|
41
|
+
#puts entry
|
42
|
+
histos[entry] = histogram4lumin path+entry
|
43
|
+
end
|
44
|
+
|
45
|
+
|
46
|
+
pic = ARGV[0]
|
47
|
+
h = histogram4lumin path+pic
|
48
|
+
|
49
|
+
dists = {}
|
50
|
+
histos.each do |k,v|
|
51
|
+
dists[k] = progress_max_metric h, v
|
52
|
+
end
|
53
|
+
|
54
|
+
dists = dists.to_a.sort_by {|a,b| b}
|
55
|
+
|
56
|
+
pp dists
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: grayphash
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.10
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-08-08 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: pHash image wrapper
|
15
15
|
email: tauraloke@gmail.com
|
@@ -20,6 +20,7 @@ extra_rdoc_files: []
|
|
20
20
|
files:
|
21
21
|
- lib/grayphash.rb
|
22
22
|
- ext/grayphash/grayphash.cpp
|
23
|
+
- ext/grayphash/histo.rb
|
23
24
|
- ext/grayphash/extconf.rb
|
24
25
|
homepage: http://github.com/tauraloke/grayphash
|
25
26
|
licenses:
|