sqed 0.4.1 → 0.4.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/sqed.rb +1 -0
- data/lib/sqed/boundary_finder.rb +2 -49
- data/lib/sqed/boundary_finder/color_line_finder.rb +60 -3
- data/lib/sqed/version.rb +1 -1
- data/lib/sqed_config.rb +15 -1
- data/lib/sqed_utils.rb +60 -0
- data/spec/lib/sqed_utils_spec.rb +42 -0
- data/spec/lib/stage_handling/lep_stage_spec.rb +64 -0
- data/spec/support/files/stage_images/lep_stage.jpg +0 -0
- data/spec/support/image_helpers.rb +4 -0
- data/sqed.gemspec +5 -5
- metadata +19 -12
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 047c0529db7c52677c9ece993cbfbb76aad0e475
|
4
|
+
data.tar.gz: d700a6fffb703f94bcb1b5e0c3250b16b9b65894
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c45f312e2c5d42706104997a101b9aa5bcc25b37ddd774260b337e16d5426f17bf75614fd17b662c8444beecdd5c79e9d7520060b98a665f90a61f830aeec599
|
7
|
+
data.tar.gz: 0c14d57039134180aa3f9f85d80e24fe3d4863eb4a1e6116e2f6bfd08d4e18ad8d031f7de7d0cf3cd87625db2f4f7bb27edfc034cee1b1c0962c3ca64a67cf0b
|
data/lib/sqed.rb
CHANGED
data/lib/sqed/boundary_finder.rb
CHANGED
@@ -119,8 +119,9 @@ class Sqed
|
|
119
119
|
# @param scan
|
120
120
|
# (:rows|:columns), :rows finds vertical borders, :columns finds horizontal borders
|
121
121
|
#
|
122
|
+
#
|
123
|
+
# image: image, sample_subdivision_size: nil, sample_cutoff_factor: nil, scan: :rows, boundary_color: :green)
|
122
124
|
def self.color_boundary_finder(**opts)
|
123
|
-
# image: image, sample_subdivision_size: nil, sample_cutoff_factor: nil, scan: :rows, boundary_color: :green)
|
124
125
|
image = opts[:image]
|
125
126
|
sample_subdivision_size = opts[:sample_subdivision_size]
|
126
127
|
sample_cutoff_factor = opts[:sample_cutoff_factor]
|
@@ -222,54 +223,6 @@ class Sqed
|
|
222
223
|
[hit_ranges.first, hit_ranges[(hit_ranges.length / 2).to_i], hit_ranges.last]
|
223
224
|
end
|
224
225
|
|
225
|
-
# @return [Array]
|
226
|
-
# like `[0,1,2]`
|
227
|
-
# If median-min or max-median * width_factor are different from one another (by more than width_factor) then replace the larger wth the median +/- 1/2 the smaller
|
228
|
-
# Given [10, 12, 20] and width_factor 2 the result will be [10, 12, 13]
|
229
|
-
#
|
230
|
-
def corrected_frequency(frequency_stats, width_factor = 3.0, max_width = nil)
|
231
|
-
v0 = frequency_stats[0]
|
232
|
-
m = frequency_stats[1]
|
233
|
-
v2 = frequency_stats[2]
|
234
|
-
|
235
|
-
width_pct = nil
|
236
|
-
|
237
|
-
# If the width of the detected line is > 5 percent then
|
238
|
-
# assume the center is good measure, and use an arbitrary percentage width.
|
239
|
-
if !max_width.nil?
|
240
|
-
width_pct = (v2 - v0).to_f / max_width.to_f
|
241
|
-
end
|
242
|
-
|
243
|
-
if !width_pct.nil? && width_pct >= 0.05
|
244
|
-
half_width = max_width * 0.025
|
245
|
-
z = [m - half_width, m, m + half_width]
|
246
|
-
return z
|
247
|
-
end
|
248
|
-
|
249
|
-
# a = m - v0
|
250
|
-
# b = v2 - m
|
251
|
-
|
252
|
-
# largest = (a > b ? a : b)
|
253
|
-
|
254
|
-
# c = a * width_factor
|
255
|
-
# d = b * width_factor
|
256
|
-
|
257
|
-
# if c > largest || d > largest
|
258
|
-
# e = c > largest ? ((m - b) / 2).to_i : v0
|
259
|
-
# f = d > largest ? ((m + a) / 2).to_i : v2
|
260
|
-
# [e, m, f]
|
261
|
-
# else
|
262
|
-
# frequency_stats
|
263
|
-
# end
|
264
|
-
|
265
|
-
if a * width_factor > largest
|
266
|
-
[(m - (v2 - m) / 2).to_i, m, v2]
|
267
|
-
elsif b * width_factor > largest
|
268
|
-
[v0, m, (m + (m - v0) / 2).to_i]
|
269
|
-
else
|
270
|
-
frequency_stats
|
271
|
-
end
|
272
|
-
end
|
273
226
|
|
274
227
|
# Returns an Integer, the maximum of the pairwise differences of the values in the array
|
275
228
|
# For example, given
|
@@ -30,7 +30,57 @@ class Sqed::BoundaryFinder::ColorLineFinder < Sqed::BoundaryFinder
|
|
30
30
|
def find_bands
|
31
31
|
case layout # boundaries.coordinates are referenced from stage image
|
32
32
|
|
33
|
-
|
33
|
+
# No specs for this yet
|
34
|
+
when :lep_stage
|
35
|
+
top_bottom_split = Sqed::BoundaryFinder.color_boundary_finder(image: image, scan: :columns, boundary_color: boundary_color) # detect vertical division [array]
|
36
|
+
left_right_split = Sqed::BoundaryFinder.color_boundary_finder(image: image, sample_subdivision_size: 2, boundary_color: boundary_color) # detect horizontal division [array]
|
37
|
+
|
38
|
+
boundaries.set(6, [0, top_bottom_split[2], left_right_split[0], image.rows - top_bottom_split[2]] )
|
39
|
+
|
40
|
+
left_top_image = image.crop( 0, 0, left_right_split[0], top_bottom_split[0], true)
|
41
|
+
|
42
|
+
left_top_split =
|
43
|
+
SqedUtils.corrected_frequency(
|
44
|
+
Sqed::BoundaryFinder.color_boundary_finder(image: left_top_image, boundary_color: boundary_color),
|
45
|
+
max_width: left_top_image.columns,
|
46
|
+
width_factor: 1.8
|
47
|
+
)
|
48
|
+
|
49
|
+
boundaries.set(0, [0, 0, left_top_split[1], top_bottom_split[0]] ) # keep as 1 for safety
|
50
|
+
|
51
|
+
boundaries.set(1, [left_top_split[2], 0, left_top_image.columns - left_top_split[2], top_bottom_split[0]] ) # <
|
52
|
+
|
53
|
+
boundaries.set(2, [left_right_split[2], 0, image.columns - left_right_split[0], top_bottom_split[0]] )
|
54
|
+
|
55
|
+
bottom_right_image = image.crop(left_right_split[2], top_bottom_split[2], image.columns - left_right_split[2], image.rows - top_bottom_split[2], true)
|
56
|
+
|
57
|
+
bottom_right_split =
|
58
|
+
SqedUtils.corrected_frequency(
|
59
|
+
Sqed::BoundaryFinder.color_boundary_finder(image: bottom_right_image, boundary_color: boundary_color, scan: :rows),
|
60
|
+
max_width: bottom_right_image.columns,
|
61
|
+
width_factor: 1.8
|
62
|
+
)
|
63
|
+
|
64
|
+
boundaries.set(3, [left_right_split[2] + bottom_right_split[2], top_bottom_split[2], image.columns - bottom_right_split[2], image.rows - top_bottom_split[2] ] )
|
65
|
+
|
66
|
+
bottom_right_left_image = image.crop(left_right_split[2], top_bottom_split[2], bottom_right_split[0], image.rows - top_bottom_split[2], true)
|
67
|
+
|
68
|
+
bottom_right_left_split =
|
69
|
+
SqedUtils.corrected_frequency(
|
70
|
+
Sqed::BoundaryFinder.color_boundary_finder(image: bottom_right_left_image, scan: :columns, boundary_color: boundary_color),
|
71
|
+
max_width: bottom_right_left_image.columns,
|
72
|
+
width_factor: 1.8
|
73
|
+
)
|
74
|
+
|
75
|
+
boundaries.set(4, [left_right_split[2], top_bottom_split[2], bottom_right_image.columns - bottom_right_left_image.columns, bottom_right_left_split[0] ] )
|
76
|
+
|
77
|
+
boundaries.set(5, [
|
78
|
+
left_right_split[2],
|
79
|
+
top_bottom_split[2] + bottom_right_left_split[2],
|
80
|
+
bottom_right_image.columns - bottom_right_left_image.columns,
|
81
|
+
bottom_right_left_image.rows - bottom_right_left_split[2]
|
82
|
+
])
|
83
|
+
|
34
84
|
when :seven_slot
|
35
85
|
top_bottom_split = Sqed::BoundaryFinder.color_boundary_finder(image: image, scan: :columns, boundary_color: boundary_color) # detect vertical division [array]
|
36
86
|
left_right_split = Sqed::BoundaryFinder.color_boundary_finder(image: image, sample_subdivision_size: 2, boundary_color: boundary_color) # detect horizontal division [array]
|
@@ -41,12 +91,19 @@ class Sqed::BoundaryFinder::ColorLineFinder < Sqed::BoundaryFinder
|
|
41
91
|
right_top_image = image.crop( left_right_split[2], 0, image.columns - left_right_split[2], top_bottom_split[0] , true) # sections 1,2
|
42
92
|
right_bottom_image = image.crop(left_right_split[2], top_bottom_split[2], image.columns - left_right_split[2], image.rows - top_bottom_split[2], true) # sections 3,4,5
|
43
93
|
|
44
|
-
right_top_split =
|
94
|
+
right_top_split = ::SqedUtils.corrected_frequency(
|
95
|
+
Sqed::BoundaryFinder.color_boundary_finder(image: right_top_image, boundary_color: boundary_color),
|
96
|
+
width_factor: 1.8,
|
97
|
+
max_width: right_top_image.columns
|
98
|
+
) # vertical line b/w 1 & 2, use "corrected_frequency" to account for color bleed from previous crop
|
45
99
|
|
46
100
|
boundaries.set(1, [left_right_split[2], 0, right_top_split[0], top_bottom_split[0]] )
|
47
101
|
boundaries.set(2, [left_right_split[2] + right_top_split[2], 0, right_top_image.columns - right_top_split[2], top_bottom_split[0]])
|
48
102
|
|
49
|
-
right_bottom_split = corrected_frequency(
|
103
|
+
right_bottom_split = SqedUtils.corrected_frequency(
|
104
|
+
Sqed::BoundaryFinder.color_boundary_finder(image: right_bottom_image, scan: :columns, sample_subdivision_size: 2, boundary_color: boundary_color),
|
105
|
+
width_factor: 1.8,
|
106
|
+
max_width: right_bottom_image.rows) # horizontal line b/w (5,3) & 4, use "corrected_frequency" to account for color bleed from previous crop
|
50
107
|
|
51
108
|
bottom_right_top_image = right_bottom_image.crop(0,0, image.columns - left_right_split[2], right_bottom_split[0], true) # 3,5
|
52
109
|
|
data/lib/sqed/version.rb
CHANGED
data/lib/sqed_config.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
# require 'zxing'
|
2
2
|
|
3
|
+
require_relative 'sqed_utils'
|
4
|
+
|
3
5
|
require_relative 'sqed/parser'
|
4
6
|
require_relative 'sqed/parser/ocr_parser'
|
5
7
|
require_relative 'sqed/parser/barcode_parser'
|
@@ -62,6 +64,11 @@ module SqedConfig
|
|
62
64
|
# 6 |--------
|
63
65
|
# | 4
|
64
66
|
#
|
67
|
+
# 0 | 1 | 2
|
68
|
+
# ------------
|
69
|
+
# | 5 | :lep_stage
|
70
|
+
# 6 |---- 3
|
71
|
+
# | 4 |
|
65
72
|
#
|
66
73
|
# Hash values are used to stub out
|
67
74
|
# the Sqed::Boundaries instance.
|
@@ -74,7 +81,8 @@ module SqedConfig
|
|
74
81
|
right_t: [0, 1, 2],
|
75
82
|
left_t: [0, 1, 2],
|
76
83
|
internal_box: [0],
|
77
|
-
seven_slot: [0, 1, 2, 3, 4, 5, 6]
|
84
|
+
seven_slot: [0, 1, 2, 3, 4, 5, 6],
|
85
|
+
lep_stage: [0, 1, 2, 3, 4, 5, 6]
|
78
86
|
}.freeze
|
79
87
|
|
80
88
|
# Each element of the layout is a "section".
|
@@ -142,6 +150,12 @@ module SqedConfig
|
|
142
150
|
boundary_finder: Sqed::BoundaryFinder::ColorLineFinder,
|
143
151
|
layout: :seven_slot,
|
144
152
|
metadata_map: { 0 => :collecting_event_labels, 1 => :determination_labels, 2 => :other_labels, 3 => :image_registration, 4 => :curator_metadata, 5 => :identifier, 6 => :specimen }
|
153
|
+
},
|
154
|
+
|
155
|
+
lep_stage: {
|
156
|
+
boundary_finder: Sqed::BoundaryFinder::ColorLineFinder,
|
157
|
+
layout: :lep_stage,
|
158
|
+
metadata_map: { 0 => :curator_metadata, 1 => :collecting_event_labels, 2 => :image_registration, 3 => :identifier, 4 => :other_labels, 5 => :determination_labels, 6 => :specimen }
|
145
159
|
}
|
146
160
|
}.freeze
|
147
161
|
|
data/lib/sqed_utils.rb
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'byebug'
|
2
|
+
|
3
|
+
# Functions that don't belong in Sqed proper
|
4
|
+
#
|
5
|
+
module SqedUtils
|
6
|
+
|
7
|
+
|
8
|
+
# @return [Array]
|
9
|
+
# like `[0,1,2]`
|
10
|
+
#
|
11
|
+
# @param frequency_stats [Array]
|
12
|
+
# like [1,2,3]
|
13
|
+
#
|
14
|
+
# @param max_width [Integer]
|
15
|
+
# required, the width of the image in question
|
16
|
+
#
|
17
|
+
# See tests. This code does a rough job of smoothing out boundaries that seem to
|
18
|
+
# be biased on one side or the other. Definitely could be refined to use a more
|
19
|
+
# weighted approach.
|
20
|
+
#
|
21
|
+
def self.corrected_frequency(frequency_stats, width_factor: 3.0, max_width: nil)
|
22
|
+
|
23
|
+
return frequency_stats if max_width.nil?
|
24
|
+
|
25
|
+
v0 = frequency_stats[0]
|
26
|
+
m = frequency_stats[1]
|
27
|
+
v2 = frequency_stats[2]
|
28
|
+
|
29
|
+
width_pct = (v2.to_f - v0.to_f) / max_width.to_f
|
30
|
+
|
31
|
+
return frequency_stats if (width_pct * 100) <= 2.0
|
32
|
+
|
33
|
+
a = (m - v0).abs
|
34
|
+
b = (v2 - m).abs
|
35
|
+
|
36
|
+
c = a * width_factor
|
37
|
+
d = b * width_factor
|
38
|
+
|
39
|
+
largest = (a > b ? a : b)
|
40
|
+
|
41
|
+
l = (m - b / 2)
|
42
|
+
l = 0 if l < 0
|
43
|
+
|
44
|
+
r = (m + a / 2)
|
45
|
+
r = max_width if r > max_width
|
46
|
+
|
47
|
+
x = a * width_factor
|
48
|
+
y = b * width_factor
|
49
|
+
|
50
|
+
[
|
51
|
+
x > largest ? l : v0,
|
52
|
+
m,
|
53
|
+
y > largest ? r : v2
|
54
|
+
]
|
55
|
+
|
56
|
+
end
|
57
|
+
|
58
|
+
|
59
|
+
|
60
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'sqed_utils'
|
2
|
+
|
3
|
+
describe SqedUtils do
|
4
|
+
|
5
|
+
context '.corrected_frequency' do
|
6
|
+
|
7
|
+
specify '[1,2,3]' do
|
8
|
+
expect(SqedUtils.corrected_frequency([1,2,3])).to eq([1,2,3] )
|
9
|
+
end
|
10
|
+
|
11
|
+
specify '[1,2,3], max_width: 100' do
|
12
|
+
expect(SqedUtils.corrected_frequency([1,2,3], max_width: 100)).to eq([1,2,3] )
|
13
|
+
end
|
14
|
+
|
15
|
+
specify '[90,100,1000], max_width: 2000' do
|
16
|
+
expect(SqedUtils.corrected_frequency([90,100,1000], max_width: 2000)).to eq([90, 100, 105] )
|
17
|
+
end
|
18
|
+
|
19
|
+
specify '[90,100,1000], max_width: 2000)' do
|
20
|
+
expect(SqedUtils.corrected_frequency([90,100,1000], max_width: 2000)).to eq([90, 100, 105] )
|
21
|
+
end
|
22
|
+
|
23
|
+
specify '[90,1000,1010], max_width: 2000)' do
|
24
|
+
expect(SqedUtils.corrected_frequency([90,1000,1010], max_width: 2000)).to eq([995, 1000, 1010] )
|
25
|
+
end
|
26
|
+
|
27
|
+
specify '[10, 12, 20], max_width: 2000' do
|
28
|
+
expect(SqedUtils.corrected_frequency([10, 12, 20], max_width: 2000)).to eq([10, 12, 20] )
|
29
|
+
end
|
30
|
+
|
31
|
+
specify '[10, 12, 20], max_width: 100)' do
|
32
|
+
expect(SqedUtils.corrected_frequency([10, 12, 20], max_width: 100)).to eq([10, 12, 13] )
|
33
|
+
end
|
34
|
+
|
35
|
+
specify '[10, 12, 20], max_width: 100, width_factor: 5)' do
|
36
|
+
expect(SqedUtils.corrected_frequency([1, 3, 10], max_width: 100, width_factor: 5)).to eq([0, 3, 4] )
|
37
|
+
end
|
38
|
+
|
39
|
+
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'handling lep stage images' do
|
4
|
+
|
5
|
+
let(:image) { ImageHelpers.lep_stage }
|
6
|
+
let(:sqed) do
|
7
|
+
Sqed.new(
|
8
|
+
image: image,
|
9
|
+
pattern: :lep_stage,
|
10
|
+
boundary_color: :red,
|
11
|
+
has_border: false )
|
12
|
+
end
|
13
|
+
|
14
|
+
let(:m) do
|
15
|
+
{ 0 => :curator_metadata,
|
16
|
+
1 => :collecting_event_labels,
|
17
|
+
2 => :image_registration,
|
18
|
+
3 => :identifier,
|
19
|
+
4 => :other_labels,
|
20
|
+
5 => :determination_labels,
|
21
|
+
6 => :specimen
|
22
|
+
}
|
23
|
+
end
|
24
|
+
|
25
|
+
context 'parses' do
|
26
|
+
specify 'new() without errors' do
|
27
|
+
expect(sqed).to be_truthy
|
28
|
+
end
|
29
|
+
|
30
|
+
specify 'get result without errors' do
|
31
|
+
expect(sqed.result).to be_truthy
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
context 'trickier boundaries - without thumbnail' do
|
36
|
+
let(:s) { Sqed.new(image: ImageHelpers.lep_stage, use_thumbnail: false, pattern: :lep_stage, boundary_color: :red, has_border: false ) }
|
37
|
+
|
38
|
+
specify 'boundaries are reasonable' do
|
39
|
+
s.result
|
40
|
+
c = s.boundaries.coordinates
|
41
|
+
c.each do |section, values|
|
42
|
+
c[section].each_with_index do |v, i|
|
43
|
+
msg = "section #{section}, index #{i} has a bad value '#{v}'"
|
44
|
+
expect(v > -1).to be_truthy, msg
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
context 'trickier boundaries - with_thumbnail' do
|
51
|
+
let(:s) { Sqed.new(image: ImageHelpers.lep_stage, use_thumbnail: true, pattern: :lep_stage, boundary_color: :red, has_border: false ) }
|
52
|
+
|
53
|
+
specify 'boundaries are reasonable' do
|
54
|
+
s.result
|
55
|
+
c = s.boundaries.coordinates
|
56
|
+
c.each do |section, values|
|
57
|
+
c[section].each_with_index do |v, i|
|
58
|
+
msg = "section #{section}, index #{i} has a bad value '#{v}'"
|
59
|
+
expect(v > -1).to be_truthy, msg
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
Binary file
|
data/sqed.gemspec
CHANGED
@@ -8,7 +8,7 @@ Gem::Specification.new do |spec|
|
|
8
8
|
spec.version = Sqed::VERSION
|
9
9
|
spec.authors = ["Matt Yoder", "Rich Flood"]
|
10
10
|
spec.email = ["diapriid@gmail.com"]
|
11
|
-
spec.summary = %q{Specimens Quickly
|
11
|
+
spec.summary = %q{Specimens Quickly extracted and Digitized, or just "squid". A ruby gem for image based specimen accessioning.}
|
12
12
|
spec.description = %q{A utility gem to aid in the processing of images taken in the process of digitizing natural history collections.}
|
13
13
|
spec.homepage = "http://github.com/SpeciesFileGroup/sqed"
|
14
14
|
spec.license = "NCSA"
|
@@ -18,17 +18,17 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
19
|
spec.require_paths = ["lib"]
|
20
20
|
|
21
|
-
spec.add_dependency 'rake', '~> 12.
|
21
|
+
spec.add_dependency 'rake', '~> 12.3'
|
22
22
|
spec.add_dependency 'rmagick', '~> 2.16'
|
23
|
-
spec.add_dependency 'rtesseract', '~> 2.
|
23
|
+
spec.add_dependency 'rtesseract', '~> 2.2.0'
|
24
24
|
|
25
25
|
# A qrcode reader, too many problems with compiling, dependencies
|
26
26
|
# spec.add_dependency 'zxing_cpp', '~> 0.1.0'
|
27
27
|
|
28
|
-
spec.add_development_dependency 'rspec', '~> 3.
|
28
|
+
spec.add_development_dependency 'rspec', '~> 3.8'
|
29
29
|
spec.add_development_dependency 'bundler', '~> 1.5'
|
30
30
|
# spec.add_development_dependency 'did_you_mean', '~> 0.9'
|
31
|
-
spec.add_development_dependency 'byebug', '~>
|
31
|
+
spec.add_development_dependency 'byebug', '~> 10.0.0'
|
32
32
|
spec.add_development_dependency 'awesome_print', '~> 1.8'
|
33
33
|
end
|
34
34
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sqed
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Matt Yoder
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2018-
|
12
|
+
date: 2018-09-07 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rake
|
@@ -17,14 +17,14 @@ dependencies:
|
|
17
17
|
requirements:
|
18
18
|
- - "~>"
|
19
19
|
- !ruby/object:Gem::Version
|
20
|
-
version: '12.
|
20
|
+
version: '12.3'
|
21
21
|
type: :runtime
|
22
22
|
prerelease: false
|
23
23
|
version_requirements: !ruby/object:Gem::Requirement
|
24
24
|
requirements:
|
25
25
|
- - "~>"
|
26
26
|
- !ruby/object:Gem::Version
|
27
|
-
version: '12.
|
27
|
+
version: '12.3'
|
28
28
|
- !ruby/object:Gem::Dependency
|
29
29
|
name: rmagick
|
30
30
|
requirement: !ruby/object:Gem::Requirement
|
@@ -45,28 +45,28 @@ dependencies:
|
|
45
45
|
requirements:
|
46
46
|
- - "~>"
|
47
47
|
- !ruby/object:Gem::Version
|
48
|
-
version: 2.
|
48
|
+
version: 2.2.0
|
49
49
|
type: :runtime
|
50
50
|
prerelease: false
|
51
51
|
version_requirements: !ruby/object:Gem::Requirement
|
52
52
|
requirements:
|
53
53
|
- - "~>"
|
54
54
|
- !ruby/object:Gem::Version
|
55
|
-
version: 2.
|
55
|
+
version: 2.2.0
|
56
56
|
- !ruby/object:Gem::Dependency
|
57
57
|
name: rspec
|
58
58
|
requirement: !ruby/object:Gem::Requirement
|
59
59
|
requirements:
|
60
60
|
- - "~>"
|
61
61
|
- !ruby/object:Gem::Version
|
62
|
-
version: '3.
|
62
|
+
version: '3.8'
|
63
63
|
type: :development
|
64
64
|
prerelease: false
|
65
65
|
version_requirements: !ruby/object:Gem::Requirement
|
66
66
|
requirements:
|
67
67
|
- - "~>"
|
68
68
|
- !ruby/object:Gem::Version
|
69
|
-
version: '3.
|
69
|
+
version: '3.8'
|
70
70
|
- !ruby/object:Gem::Dependency
|
71
71
|
name: bundler
|
72
72
|
requirement: !ruby/object:Gem::Requirement
|
@@ -87,14 +87,14 @@ dependencies:
|
|
87
87
|
requirements:
|
88
88
|
- - "~>"
|
89
89
|
- !ruby/object:Gem::Version
|
90
|
-
version:
|
90
|
+
version: 10.0.0
|
91
91
|
type: :development
|
92
92
|
prerelease: false
|
93
93
|
version_requirements: !ruby/object:Gem::Requirement
|
94
94
|
requirements:
|
95
95
|
- - "~>"
|
96
96
|
- !ruby/object:Gem::Version
|
97
|
-
version:
|
97
|
+
version: 10.0.0
|
98
98
|
- !ruby/object:Gem::Dependency
|
99
99
|
name: awesome_print
|
100
100
|
requirement: !ruby/object:Gem::Requirement
|
@@ -139,6 +139,7 @@ files:
|
|
139
139
|
- lib/sqed/result.rb
|
140
140
|
- lib/sqed/version.rb
|
141
141
|
- lib/sqed_config.rb
|
142
|
+
- lib/sqed_utils.rb
|
142
143
|
- spec/lib/sqed/boundaries_spec.rb
|
143
144
|
- spec/lib/sqed/boundary_finder/color_line_finder_spec.rb
|
144
145
|
- spec/lib/sqed/boundary_finder/cross_finder_spec.rb
|
@@ -150,6 +151,8 @@ files:
|
|
150
151
|
- spec/lib/sqed/parser_spec.rb
|
151
152
|
- spec/lib/sqed/result_spec.rb
|
152
153
|
- spec/lib/sqed_spec.rb
|
154
|
+
- spec/lib/sqed_utils_spec.rb
|
155
|
+
- spec/lib/stage_handling/lep_stage_spec.rb
|
153
156
|
- spec/lib/stage_handling/seven_slot_spec.rb
|
154
157
|
- spec/spec_helper.rb
|
155
158
|
- spec/support/files/barcode_images/code_128_barcode.png
|
@@ -175,6 +178,7 @@ files:
|
|
175
178
|
- spec/support/files/stage_images/inhs_7_slot.jpg
|
176
179
|
- spec/support/files/stage_images/inhs_7_slot2.jpg
|
177
180
|
- spec/support/files/stage_images/inhs_four_thirds.jpg
|
181
|
+
- spec/support/files/stage_images/lep_stage.jpg
|
178
182
|
- spec/support/files/test0.jpg
|
179
183
|
- spec/support/files/test1.jpg
|
180
184
|
- spec/support/files/test2.jpg
|
@@ -206,8 +210,8 @@ rubyforge_project:
|
|
206
210
|
rubygems_version: 2.6.14
|
207
211
|
signing_key:
|
208
212
|
specification_version: 4
|
209
|
-
summary: Specimens Quickly
|
210
|
-
image
|
213
|
+
summary: Specimens Quickly extracted and Digitized, or just "squid". A ruby gem for
|
214
|
+
image based specimen accessioning.
|
211
215
|
test_files:
|
212
216
|
- spec/lib/sqed/boundaries_spec.rb
|
213
217
|
- spec/lib/sqed/boundary_finder/color_line_finder_spec.rb
|
@@ -220,6 +224,8 @@ test_files:
|
|
220
224
|
- spec/lib/sqed/parser_spec.rb
|
221
225
|
- spec/lib/sqed/result_spec.rb
|
222
226
|
- spec/lib/sqed_spec.rb
|
227
|
+
- spec/lib/sqed_utils_spec.rb
|
228
|
+
- spec/lib/stage_handling/lep_stage_spec.rb
|
223
229
|
- spec/lib/stage_handling/seven_slot_spec.rb
|
224
230
|
- spec/spec_helper.rb
|
225
231
|
- spec/support/files/barcode_images/code_128_barcode.png
|
@@ -245,6 +251,7 @@ test_files:
|
|
245
251
|
- spec/support/files/stage_images/inhs_7_slot.jpg
|
246
252
|
- spec/support/files/stage_images/inhs_7_slot2.jpg
|
247
253
|
- spec/support/files/stage_images/inhs_four_thirds.jpg
|
254
|
+
- spec/support/files/stage_images/lep_stage.jpg
|
248
255
|
- spec/support/files/test0.jpg
|
249
256
|
- spec/support/files/test1.jpg
|
250
257
|
- spec/support/files/test2.jpg
|