image_filter_dsl 0.0.2 → 0.1.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/README.md +207 -0
- data/lib/image_filter_dsl.rb +2 -2
- data/lib/image_filter_dsl/binary/serialize.rb +4 -2
- data/lib/image_filter_dsl/binary/struct.rb +3 -3
- data/lib/image_filter_dsl/dsl/filter.rb +3 -3
- data/lib/image_filter_dsl/dsl/filter_instructions.rb +120 -22
- data/lib/image_filter_dsl/dsl/kernel.rb +4 -2
- data/lib/image_filter_dsl/engine/image_processor.rb +5 -3
- data/lib/image_filter_dsl/engine/io.rb +7 -2
- metadata +12 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 64f070bf94d94ef0c6e0de6a78fa7ccd8f29f181e866d4aa374f26a4e427f18f
|
4
|
+
data.tar.gz: 6347c8d1b350387e369e2e56d023f0fa944dd70a4870035af55619287e11bd7f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a8c55bf124bf7e454021ec8b644373566467eeec81786875bc9fa4d89ee0fa86e7e7044c71c83aa0396a3e97c7b0347d3cdd55e952e98c256c02b9f48a524d4e
|
7
|
+
data.tar.gz: 4590228397df810c7b75a5c59c1a4a1510e4e7ce723dd36e168f7a9f377dc6decf1b434cdca926e0c6ecc7a4196dae96b7ba6d0beda91b3743994b6e96bd910d
|
data/README.md
ADDED
@@ -0,0 +1,207 @@
|
|
1
|
+
# Image Filter DSL
|
2
|
+
|
3
|
+
_An Image Filter DSL (duh)_
|
4
|
+
|
5
|
+
[](https://badge.fury.io/rb/image_filter_dsl)
|
6
|
+
|
7
|
+
{file:CHANGELOG.md Change Log}
|
8
|
+
|
9
|
+
## Features
|
10
|
+
|
11
|
+
- DSL with customizable input and output variables, and a set of basic instructions
|
12
|
+
- IO with serialization so Kernels can be written to binary files and loaded from binary files
|
13
|
+
- Image Processor that generates image file by applying Filter Kernel to every pixel of input image (supports multi-threading)
|
14
|
+
|
15
|
+
## DSL
|
16
|
+
|
17
|
+
### Filter Block
|
18
|
+
|
19
|
+
Using `ImageFilterDsl::Dsl::Filter`
|
20
|
+
|
21
|
+
```ruby
|
22
|
+
# - First array contains input variables
|
23
|
+
# x, y, r, g, b, a, :width and :hght are automatically
|
24
|
+
# populated by image filter process
|
25
|
+
# - Second array contains output vars; r,g,b,a and optionally
|
26
|
+
# x,y for images
|
27
|
+
filter = Filter.define [:x,:y,:r,:g,:b], [:r,:g,:b] do
|
28
|
+
# Instructions go here
|
29
|
+
# instruction [input(s)], output
|
30
|
+
add [:x,:r], :g
|
31
|
+
|
32
|
+
# output can be an existing symbol in out, or a custom one up to 5 letters
|
33
|
+
# long (longer will be trimmed if serialized to a binary file)
|
34
|
+
|
35
|
+
# input can be any declared input or custom variable
|
36
|
+
end
|
37
|
+
```
|
38
|
+
|
39
|
+
### Instructions
|
40
|
+
|
41
|
+
Basic Use:
|
42
|
+
|
43
|
+
``instruction [argument1,argument2,...], :output_variable``
|
44
|
+
|
45
|
+
__Math__
|
46
|
+
|
47
|
+
- `add` add 2 or more input values, storing in output (<code>a+b</code>)
|
48
|
+
|
49
|
+
```ruby
|
50
|
+
add [:r,5], :r # replace r with r + 5
|
51
|
+
```
|
52
|
+
|
53
|
+
- `mult` add 2 or more inputs, storing in out (<code>a*b</code>)
|
54
|
+
|
55
|
+
```ruby
|
56
|
+
mult [:r,2], :r # Replace r with r * 2
|
57
|
+
```
|
58
|
+
|
59
|
+
- `div` divide 2 inputs
|
60
|
+
|
61
|
+
```ruby
|
62
|
+
div [:r, 2], :g # Write r/2 to g
|
63
|
+
```
|
64
|
+
|
65
|
+
- `mod` store modulo of two inputs in output
|
66
|
+
|
67
|
+
```ruby
|
68
|
+
mod [2,4], :t # Write 2$4 (2) to t
|
69
|
+
```
|
70
|
+
|
71
|
+
- `abs` store absolute value of input in output
|
72
|
+
|
73
|
+
```ruby
|
74
|
+
abs [-5], :r # Writes abs(5) to r
|
75
|
+
```
|
76
|
+
|
77
|
+
__Collection__
|
78
|
+
|
79
|
+
- `min` store smallest of inputs in output (accepts 2 or more values)
|
80
|
+
|
81
|
+
```ruby
|
82
|
+
min [:r,255,:g], :s # Writes smallest of r, 255 and g to s
|
83
|
+
```
|
84
|
+
|
85
|
+
- `max` store largest of inputs in output (accepts 2 or more values)
|
86
|
+
|
87
|
+
```ruby
|
88
|
+
max [:r,0,:g], :s # Writes largest of r, 0 and g to s
|
89
|
+
```
|
90
|
+
|
91
|
+
- `avg` store average of inputs in output (accepts 2 or more values)
|
92
|
+
|
93
|
+
```ruby
|
94
|
+
avg [:r,:g,:b], :ca # Writes (r+g+b)/3 to ca
|
95
|
+
```
|
96
|
+
|
97
|
+
|
98
|
+
__Logic/Conversion/Memory__
|
99
|
+
|
100
|
+
- `above` choose one of two values based on greater than comparison (2 or 4 values) `[n1,n1,true_val,false_val]` (If not specified, `true_val` is 1 and `false_val` is 0)
|
101
|
+
|
102
|
+
```ruby
|
103
|
+
# if r > g, store 0 in g, else store g in g (keep g the same)
|
104
|
+
above [:r,:g,0,:g], :g
|
105
|
+
```
|
106
|
+
|
107
|
+
- `below` choose one of two values based on less than comparison (2 or 4 values) `[n1,n1,true_val,false_val]` (If not specified, `true_val` is 1 and `false_val` is 0)
|
108
|
+
|
109
|
+
```ruby
|
110
|
+
# if r < g, store 0 in r, else store r in r (keep r the same)
|
111
|
+
below [:r,:g,0,:r], :r
|
112
|
+
```
|
113
|
+
|
114
|
+
- `between` choose one of two values based on whether value is between two others (3 or 5 values) `[min,max,value,true_val,false_val]` (If not specified, `true_val` is 1 and `false_val` is 0)
|
115
|
+
|
116
|
+
```ruby
|
117
|
+
# Returns value since val > 1 && val < 3
|
118
|
+
below [1,3,2], :r
|
119
|
+
# Returns 1 since -1 < 1
|
120
|
+
below [1,-1,5], :r
|
121
|
+
```
|
122
|
+
|
123
|
+
- `switch` choose one of two values based on condition value (1/1.0 = true, 0/0.0 = false) `[cond,true_val,false_val]`
|
124
|
+
|
125
|
+
```ruby
|
126
|
+
# If c is true, store r in a, else store g in a
|
127
|
+
switch [:c,:r,:g], :a
|
128
|
+
```
|
129
|
+
|
130
|
+
- `eq` if two input values are equal, store 1, else 0 (_2 values_) (`[val1,val2]`)
|
131
|
+
- `bnot` if input is 1 or 1.0, store 0, else 1 (_1 value_) (`[bool]`)
|
132
|
+
- `band` if _all_ input values are 1 or 1.0, store 1, else 0 (_1+ values_) (`[val1,val2,...]`)
|
133
|
+
- `bor` if _any_ input values are 1 or 1.0, store 1, else 0 (_1+ values_) (`[val1,val2,...]`)
|
134
|
+
- `copy` copy input directly to output (`[src]`)
|
135
|
+
- `ceil` nearest whole integer of input, rounded up (_1 value_) (`[val]`)
|
136
|
+
- `floor` nearest whole integer of input, rounded down (_1 value_) (`[val]`)
|
137
|
+
- `clamp` input clamped to be no less than min, no greater than max (`[min,max,val]`)
|
138
|
+
- `float` cast input to float (_1 value_) (`[val]`)
|
139
|
+
- `round` round first input value to second value decimals (`[value,decimal_count]`)
|
140
|
+
- `mix` Mix two values together with a ratio (0*a + (1-r)*b) (`[ratio,a,b]`)
|
141
|
+
|
142
|
+
```ruby
|
143
|
+
# store (0.3*r) + (0.7*g) in b
|
144
|
+
mix [0.3,:r,:g], :b
|
145
|
+
```
|
146
|
+
|
147
|
+
__Generators__
|
148
|
+
|
149
|
+
- `rand` random float between min and max (`[min,max]`)
|
150
|
+
- `sin` sine function on single value
|
151
|
+
- `cos` cosine function on single value
|
152
|
+
- `tan` tangent function on single value
|
153
|
+
|
154
|
+
### Sample
|
155
|
+
|
156
|
+
Define filter
|
157
|
+
|
158
|
+
```
|
159
|
+
swizzle = Filter.define [:r,:g,:b], [:r,:g,:b] do
|
160
|
+
copy [:g], :t # copy green to temp
|
161
|
+
copy [:r], :g # copy red to green
|
162
|
+
copy [:b], :r # copy blue to red
|
163
|
+
copy [:t], :b # copy temp (original green) to blue
|
164
|
+
end
|
165
|
+
```
|
166
|
+
|
167
|
+
Optionally write filter kernal to binary file on disk
|
168
|
+
|
169
|
+
```ruby
|
170
|
+
ImageFilterDsl::Engine::IO.write("./swizzle.ifdk", swizzle)
|
171
|
+
```
|
172
|
+
|
173
|
+
Use filter kernal to process image
|
174
|
+
|
175
|
+
```ruby
|
176
|
+
# From binary kernal file
|
177
|
+
processor = ImageFilterDsl::Engine::ImageProcessor.new('./swizzle.ifdk')
|
178
|
+
# OR from filter object
|
179
|
+
processor = ImageFilterDsl::Engine::ImageProcessor.new(swizzle)
|
180
|
+
# or use aliases in main module
|
181
|
+
processor = ImageFilterDsl.image_processor(swizzle)
|
182
|
+
|
183
|
+
# Process image and store output
|
184
|
+
processor.process_image('./my_source.png', './my_output.png')
|
185
|
+
```
|
186
|
+
|
187
|
+
- See `./sample_filters/samples.rb` for sample filters
|
188
|
+
- See Also: [image_filter_dsl_samples](https://bitbucket.org/WadeH/image_filter_dsl_samples/src/master/) for more samples
|
189
|
+
|
190
|
+
## Gem
|
191
|
+
|
192
|
+
Either
|
193
|
+
|
194
|
+
- Build into a gem using included `gemspec` file; includes CLI functionality
|
195
|
+
- Install using gem with `gem install image_filter_dsl`
|
196
|
+
|
197
|
+
## CLI
|
198
|
+
|
199
|
+
Image Filter DSL can be made to process an image from a binary kernal using
|
200
|
+
its CLI tool, `image_filter_dsl`
|
201
|
+
|
202
|
+
- Usage: `image_filter_dsl <kernel_file> <image_in> <image_out>`
|
203
|
+
|
204
|
+
## License
|
205
|
+
|
206
|
+
(c) 2018-2020, Wade H. (vdtdev.prod@gmail.com). All Rights Reserved.
|
207
|
+
Released under MIT license
|
data/lib/image_filter_dsl.rb
CHANGED
@@ -8,8 +8,8 @@ require_relative './image_filter_dsl/engine/image_processor.rb'
|
|
8
8
|
|
9
9
|
##
|
10
10
|
# Image Filter DSL Library
|
11
|
-
# (c) 2018 VDTDEV/Wade H. ~ MIT License
|
12
|
-
# @author Wade H. <vdtdev@gmail.com>
|
11
|
+
# (c) 2018-2020 VDTDEV/Wade H. ~ MIT License
|
12
|
+
# @author Wade H. <vdtdev.prod@gmail.com>
|
13
13
|
module ImageFilterDsl
|
14
14
|
|
15
15
|
##
|
@@ -1,8 +1,10 @@
|
|
1
1
|
##
|
2
2
|
# Image Filter DSL Library
|
3
|
-
# (c) 2018 VDTDEV/Wade H. ~ MIT License
|
4
|
-
# @author Wade H. <vdtdev@gmail.com>
|
3
|
+
# (c) 2018-2020 VDTDEV/Wade H. ~ MIT License
|
4
|
+
# @author Wade H. <vdtdev.prod@gmail.com>
|
5
5
|
module ImageFilterDsl
|
6
|
+
##
|
7
|
+
# Module containing binary kernal related logic
|
6
8
|
module Binary
|
7
9
|
##
|
8
10
|
# Module providing serialization functionality for converting between
|
@@ -1,8 +1,8 @@
|
|
1
1
|
require 'bindata'
|
2
2
|
##
|
3
3
|
# Image Filter DSL Library
|
4
|
-
# (c) 2018 VDTDEV/Wade H. ~ MIT License
|
5
|
-
# @author Wade H. <vdtdev@gmail.com>
|
4
|
+
# (c) 2018-2020 VDTDEV/Wade H. ~ MIT License
|
5
|
+
# @author Wade H. <vdtdev.prod@gmail.com>
|
6
6
|
module ImageFilterDsl
|
7
7
|
module Binary
|
8
8
|
##
|
@@ -22,7 +22,7 @@ module ImageFilterDsl
|
|
22
22
|
# Constants used in header
|
23
23
|
HEADER_VALUES = {
|
24
24
|
header: "ifdKernel",
|
25
|
-
version: 0.
|
25
|
+
version: 0.02
|
26
26
|
}
|
27
27
|
|
28
28
|
##
|
@@ -1,7 +1,7 @@
|
|
1
1
|
##
|
2
2
|
# Image Filter DSL Library
|
3
|
-
# (c) 2018 VDTDEV/Wade H. ~ MIT License
|
4
|
-
# @author Wade H. <vdtdev@gmail.com>
|
3
|
+
# (c) 2018-2020 VDTDEV/Wade H. ~ MIT License
|
4
|
+
# @author Wade H. <vdtdev.prod@gmail.com>
|
5
5
|
module ImageFilterDsl
|
6
6
|
module Dsl
|
7
7
|
##
|
@@ -12,7 +12,7 @@ module ImageFilterDsl
|
|
12
12
|
# Define method
|
13
13
|
# @param [Array] ins Input symbols
|
14
14
|
# @param [Array] outs Output symbols
|
15
|
-
# @param [Proc]
|
15
|
+
# @param [Proc] block Filter instructions body
|
16
16
|
# @return [FilterKernel] new Filter Kernel
|
17
17
|
def self.define(ins,outs,&block)
|
18
18
|
kernel = Kernel::FilterKernel.new(ins,outs)
|
@@ -1,8 +1,11 @@
|
|
1
1
|
##
|
2
2
|
# Image Filter DSL Library
|
3
|
-
# (c) 2018 VDTDEV/Wade H. ~ MIT License
|
4
|
-
# @author Wade H. <vdtdev@gmail.com>
|
3
|
+
# (c) 2018-2020 VDTDEV/Wade H. ~ MIT License
|
4
|
+
# @author Wade H. <vdtdev.prod@gmail.com>
|
5
5
|
module ImageFilterDsl
|
6
|
+
##
|
7
|
+
# Module defining DSL
|
8
|
+
# {include:file:dsl.md}
|
6
9
|
module Dsl
|
7
10
|
##
|
8
11
|
# Module defining filter kernel instruction logic
|
@@ -31,7 +34,17 @@ module ImageFilterDsl
|
|
31
34
|
round: 0xd6,
|
32
35
|
switch: 0xd7,
|
33
36
|
eq: 0xd8,
|
34
|
-
bnot: 0xd9
|
37
|
+
bnot: 0xd9,
|
38
|
+
mix: 0xda,
|
39
|
+
between: 0xdb,
|
40
|
+
clamp: 0xdc,
|
41
|
+
band: 0xdd,
|
42
|
+
bor: 0xde,
|
43
|
+
# generation
|
44
|
+
rand: 0xf0,
|
45
|
+
sin: 0xf1,
|
46
|
+
cos: 0xf2,
|
47
|
+
tan: 0xf3
|
35
48
|
}
|
36
49
|
|
37
50
|
##
|
@@ -40,7 +53,7 @@ module ImageFilterDsl
|
|
40
53
|
|
41
54
|
##
|
42
55
|
# Add instruction
|
43
|
-
# @param [Array] input values
|
56
|
+
# @param [Array] i input values
|
44
57
|
# @return [Integer|Float] output value
|
45
58
|
def self.add(i)
|
46
59
|
i.sum
|
@@ -48,7 +61,7 @@ module ImageFilterDsl
|
|
48
61
|
|
49
62
|
##
|
50
63
|
# Multiply instruction
|
51
|
-
# @param [Array] input values
|
64
|
+
# @param [Array] i input values
|
52
65
|
# @return [Integer|Float] output value
|
53
66
|
def self.mult(i)
|
54
67
|
v=1;
|
@@ -58,14 +71,14 @@ module ImageFilterDsl
|
|
58
71
|
|
59
72
|
##
|
60
73
|
# Multiply instruction
|
61
|
-
# @param [Array] input values
|
74
|
+
# @param [Array] i input values
|
62
75
|
# @return [Integer|Float] output value
|
63
76
|
def self.div(i)
|
64
77
|
i[0]/i[1]
|
65
78
|
end
|
66
79
|
##
|
67
80
|
# Calculate modulo
|
68
|
-
# @param [Array] input values
|
81
|
+
# @param [Array] i input values
|
69
82
|
# @return [Integer|] output value
|
70
83
|
def self.mod(i)
|
71
84
|
i[0] % i[1]
|
@@ -73,7 +86,7 @@ module ImageFilterDsl
|
|
73
86
|
|
74
87
|
##
|
75
88
|
# Absolute value
|
76
|
-
# @param [Array] input value
|
89
|
+
# @param [Array] i input value
|
77
90
|
# @return [Integer|Float] output value
|
78
91
|
def self.abs(i)
|
79
92
|
i[0].abs
|
@@ -81,7 +94,7 @@ module ImageFilterDsl
|
|
81
94
|
|
82
95
|
##
|
83
96
|
# Minimum instruction
|
84
|
-
# @param [Array] input values
|
97
|
+
# @param [Array] i input values
|
85
98
|
# @return [Integer|Float] output value
|
86
99
|
def self.min(i)
|
87
100
|
i.min
|
@@ -89,7 +102,7 @@ module ImageFilterDsl
|
|
89
102
|
|
90
103
|
##
|
91
104
|
# Maximum instruction
|
92
|
-
# @param [Array] input values
|
105
|
+
# @param [Array] i input values
|
93
106
|
# @return [Integer|Float] output value
|
94
107
|
def self.max(i)
|
95
108
|
i.max
|
@@ -97,7 +110,7 @@ module ImageFilterDsl
|
|
97
110
|
|
98
111
|
##
|
99
112
|
# Average instruction
|
100
|
-
# @param [Array] input values
|
113
|
+
# @param [Array] i input values
|
101
114
|
# @return [Integer|Float] output value
|
102
115
|
def self.avg(i)
|
103
116
|
i.sum / (1.0 * i.length)
|
@@ -105,7 +118,7 @@ module ImageFilterDsl
|
|
105
118
|
|
106
119
|
##
|
107
120
|
# Copy instruction
|
108
|
-
# @param [Array] input values (src)
|
121
|
+
# @param [Array] i input values (src)
|
109
122
|
# @return [Integer|Float] output value
|
110
123
|
def self.copy(i)
|
111
124
|
i[0]
|
@@ -113,9 +126,11 @@ module ImageFilterDsl
|
|
113
126
|
|
114
127
|
##
|
115
128
|
# Above instruction
|
116
|
-
# @param [Array] input values (a,b,trueVal,falseVal)
|
129
|
+
# @param [Array] i input values `(a,b,trueVal,falseVal)`
|
130
|
+
# `trueVal` defaults to `1`, `falseVal` defaults to `0`
|
117
131
|
# @return [Integer|Float] output value
|
118
132
|
def self.above(i)
|
133
|
+
i = [i,1,0].flatten if i.length == 2
|
119
134
|
if(i[0]>i[1])
|
120
135
|
if i.length < 3
|
121
136
|
1
|
@@ -133,9 +148,11 @@ module ImageFilterDsl
|
|
133
148
|
|
134
149
|
##
|
135
150
|
# Below instruction
|
136
|
-
# @param [Array] input values (a,b,trueVal,falseVal)
|
151
|
+
# @param [Array] i input values `(a,b,trueVal,falseVal)`
|
152
|
+
# `trueVal` defaults to `1`, `falseVal` defaults to `0`
|
137
153
|
# @return [Integer|Float] output value
|
138
154
|
def self.below(i)
|
155
|
+
i = [i,1,0].flatten if i.length == 2
|
139
156
|
if(i[0]<i[1])
|
140
157
|
if i.length < 3
|
141
158
|
1
|
@@ -151,9 +168,31 @@ module ImageFilterDsl
|
|
151
168
|
end
|
152
169
|
end
|
153
170
|
|
171
|
+
##
|
172
|
+
# Between instruction (check if value is between two others)
|
173
|
+
# @param [Array] i input values `[min, max, value, trueVal, falseVal]`
|
174
|
+
# `trueVal` defaults to `1`, `falseVal` defaults to `0`
|
175
|
+
# @return [Integer] 1 if true, 0 if false
|
176
|
+
def self.between(i)
|
177
|
+
i = [i,1,0].flatten if i.length == 3
|
178
|
+
a,b,v,t,f = i
|
179
|
+
r = (v>=a) && (v<=b)
|
180
|
+
(r)? t : f
|
181
|
+
end
|
182
|
+
|
183
|
+
##
|
184
|
+
# Clamp value between a min and a max
|
185
|
+
# @param [Array] i input values `[min,max,val]`
|
186
|
+
# @return [Integer|Float] Value forced to be no greater than `max`
|
187
|
+
# and no less than `min`
|
188
|
+
def self.clamp(i)
|
189
|
+
a,b,v = i
|
190
|
+
[b,[a,v].max].min
|
191
|
+
end
|
192
|
+
|
154
193
|
##
|
155
194
|
# Floor instruction
|
156
|
-
# @param [Array] input value (v)
|
195
|
+
# @param [Array] i input value (v)
|
157
196
|
# @return [Integer|Float] output value
|
158
197
|
def self.floor(i)
|
159
198
|
i[0].floor
|
@@ -161,7 +200,7 @@ module ImageFilterDsl
|
|
161
200
|
|
162
201
|
##
|
163
202
|
# Ceil instruction
|
164
|
-
# @param [Array] input value (v)
|
203
|
+
# @param [Array] i input value (v)
|
165
204
|
# @return [Integer|Float] output value
|
166
205
|
def self.ceil(i)
|
167
206
|
i[0].ceil
|
@@ -169,7 +208,7 @@ module ImageFilterDsl
|
|
169
208
|
|
170
209
|
##
|
171
210
|
# Float cast instruction
|
172
|
-
# @param [Array] input value (v)
|
211
|
+
# @param [Array] i input value (v)
|
173
212
|
# @return [Integer|Float] output value
|
174
213
|
def self.float(i)
|
175
214
|
i[0].to_f
|
@@ -177,7 +216,7 @@ module ImageFilterDsl
|
|
177
216
|
|
178
217
|
##
|
179
218
|
# Round instruction
|
180
|
-
# @param [Array] input
|
219
|
+
# @param [Array] i input values (val, decimal_places)
|
181
220
|
# @return [Integer|Float] output value
|
182
221
|
def self.round(i)
|
183
222
|
i[0].round(i[1])
|
@@ -186,8 +225,8 @@ module ImageFilterDsl
|
|
186
225
|
##
|
187
226
|
# 'Switch' instruction (basically if)
|
188
227
|
#
|
189
|
-
# switch
|
190
|
-
# @param [Array] input value (condition, true val, false val)
|
228
|
+
# switch condition (0/1/0.0/1.0), trueval, falseval]
|
229
|
+
# @param [Array] i input value (condition, true val, false val)
|
191
230
|
# @return [Integer|Float] output value
|
192
231
|
def self.switch(i)
|
193
232
|
if i[0].to_i == 1
|
@@ -199,7 +238,7 @@ module ImageFilterDsl
|
|
199
238
|
|
200
239
|
##
|
201
240
|
# Equal condition instruction
|
202
|
-
# @param [Array] input
|
241
|
+
# @param [Array] i input values (a, b)
|
203
242
|
# @return [Integer|Float] output value 1 true 0 falsew
|
204
243
|
def self.eq(i)
|
205
244
|
if i[0] == i[1]
|
@@ -211,7 +250,7 @@ module ImageFilterDsl
|
|
211
250
|
|
212
251
|
##
|
213
252
|
# Logic invert instruction
|
214
|
-
# @param [Array] input value (0 or 1)
|
253
|
+
# @param [Array] i input value (0 or 1)
|
215
254
|
# @return [Integer|Float] output value (1 if in 0, 0 if in 1)
|
216
255
|
def self.bnot(i)
|
217
256
|
if i[0].to_i == 1
|
@@ -220,6 +259,65 @@ module ImageFilterDsl
|
|
220
259
|
1
|
221
260
|
end
|
222
261
|
end
|
262
|
+
|
263
|
+
##
|
264
|
+
# Logical AND instruction
|
265
|
+
# @param [Array] i input values (ints or floats)
|
266
|
+
# @return [Integer] 1 if all values are `1` or `1.0`, else 0
|
267
|
+
def self.band(i)
|
268
|
+
(i.reduce(:+).to_i == i.length)? 1 : 0
|
269
|
+
end
|
270
|
+
|
271
|
+
##
|
272
|
+
# Logical OR instruction
|
273
|
+
# @param [Array] i input values (ints or floats)
|
274
|
+
# @return [Integer] 1 if any values are `1` or `1.0`, else 0
|
275
|
+
def self.bor(i)
|
276
|
+
(i.reduce(:+).to_i > 0)? 1 : 0
|
277
|
+
end
|
278
|
+
|
279
|
+
##
|
280
|
+
# Mix two values with a ratio
|
281
|
+
# @param [Array] i input values (ratio (0-1.0), a, b)
|
282
|
+
# @return [Float] output value of ((ratio*a) + ((1.0-ratio)*b))
|
283
|
+
def self.mix(i)
|
284
|
+
ratio, a, b = i
|
285
|
+
(ratio*a)+((1.0-ratio)*b)
|
286
|
+
end
|
287
|
+
|
288
|
+
##
|
289
|
+
# Random number instruction
|
290
|
+
# @param [Array] i input values (min, max)
|
291
|
+
# @return [Float] Random number between min and max
|
292
|
+
def self.rand(i)
|
293
|
+
r=Random.new
|
294
|
+
min,max = i
|
295
|
+
(-min) + (r.rand * (max + min))
|
296
|
+
end
|
297
|
+
|
298
|
+
##
|
299
|
+
# Sine function
|
300
|
+
# @param [Array] i input value to use sin on
|
301
|
+
# @return [Float] Sine of input value
|
302
|
+
def self.sin(i)
|
303
|
+
Math.sin(i[0])
|
304
|
+
end
|
305
|
+
|
306
|
+
##
|
307
|
+
# Cosine function
|
308
|
+
# @param [Array] i input value to use cos on
|
309
|
+
# @return [Float] Cosine of input value
|
310
|
+
def self.cos(i)
|
311
|
+
Math.cos(i[0])
|
312
|
+
end
|
313
|
+
|
314
|
+
##
|
315
|
+
# Tangent function
|
316
|
+
# @param [Array] i input value to use tan on
|
317
|
+
# @return [Float] Tangent of input value
|
318
|
+
def self.tan(i)
|
319
|
+
Math.tan(i[0])
|
320
|
+
end
|
223
321
|
end
|
224
322
|
end
|
225
323
|
end
|
@@ -1,9 +1,11 @@
|
|
1
1
|
##
|
2
2
|
# Image Filter DSL Library
|
3
|
-
# (c) 2018 VDTDEV/Wade H. ~ MIT License
|
4
|
-
# @author Wade H. <vdtdev@gmail.com>
|
3
|
+
# (c) 2018-2020 VDTDEV/Wade H. ~ MIT License
|
4
|
+
# @author Wade H. <vdtdev.prod@gmail.com>
|
5
5
|
module ImageFilterDsl
|
6
6
|
module Dsl
|
7
|
+
##
|
8
|
+
# Kernal module
|
7
9
|
module Kernel
|
8
10
|
##
|
9
11
|
# IFD Filter Kernel class
|
@@ -2,9 +2,10 @@ require 'chunky_png'
|
|
2
2
|
|
3
3
|
##
|
4
4
|
# Image Filter DSL Library
|
5
|
-
# (c) 2018 VDTDEV/Wade H. ~ MIT License
|
6
|
-
# @author Wade H. <vdtdev@gmail.com>
|
5
|
+
# (c) 2018-2020 VDTDEV/Wade H. ~ MIT License
|
6
|
+
# @author Wade H. <vdtdev.prod@gmail.com>
|
7
7
|
module ImageFilterDsl
|
8
|
+
# Module containing processing engine related code
|
8
9
|
module Engine
|
9
10
|
##
|
10
11
|
# Image Processor class applies Filter Kernels to images
|
@@ -12,6 +13,8 @@ module ImageFilterDsl
|
|
12
13
|
|
13
14
|
attr_accessor :kernel, :config
|
14
15
|
|
16
|
+
|
17
|
+
|
15
18
|
##
|
16
19
|
# Constructor
|
17
20
|
# @param [Dsl::Kernel::FilterKernel|String] filter_kernel FilterKernel object or path to binary kernel file
|
@@ -120,7 +123,6 @@ module ImageFilterDsl
|
|
120
123
|
b = clr.b(pixel)
|
121
124
|
a = clr.a(pixel)
|
122
125
|
|
123
|
-
|
124
126
|
inputs = Hash[*@kernel.inputs.map{|k|[k,0]}.flatten]
|
125
127
|
inputs[:x] = x if inputs.keys.include?(:x)
|
126
128
|
inputs[:y] = y if inputs.keys.include?(:y)
|
@@ -1,7 +1,7 @@
|
|
1
1
|
##
|
2
2
|
# Image Filter DSL Library
|
3
|
-
# (c) 2018 VDTDEV/Wade H. ~ MIT License
|
4
|
-
# @author Wade H. <vdtdev@gmail.com>
|
3
|
+
# (c) 2018-2020 VDTDEV/Wade H. ~ MIT License
|
4
|
+
# @author Wade H. <vdtdev.prod@gmail.com>
|
5
5
|
module ImageFilterDsl
|
6
6
|
module Engine
|
7
7
|
##
|
@@ -10,8 +10,13 @@ module ImageFilterDsl
|
|
10
10
|
|
11
11
|
##
|
12
12
|
# Constants for format option used in read
|
13
|
+
# Dictates what is returned
|
13
14
|
module DataFormat
|
15
|
+
##
|
16
|
+
# Filter Kernal instance
|
14
17
|
KERNEL = :kernel
|
18
|
+
##
|
19
|
+
# Filter kernal record
|
15
20
|
RECORD = :record
|
16
21
|
end
|
17
22
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: image_filter_dsl
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Wade H.
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-03-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: chunky_png
|
@@ -70,13 +70,18 @@ dependencies:
|
|
70
70
|
- - "~>"
|
71
71
|
- !ruby/object:Gem::Version
|
72
72
|
version: '3.7'
|
73
|
-
description:
|
73
|
+
description: |2
|
74
|
+
Image filtering DSL including a CLI for running filters and ability
|
75
|
+
to write kernals to a binary format that will can be used to run filters
|
76
|
+
from the CLI, and potentially allow filters to be compatible with implementation
|
77
|
+
in other languages.
|
74
78
|
email: vdtdev.prod@gmail.com
|
75
79
|
executables:
|
76
80
|
- image_filter_dsl
|
77
81
|
extensions: []
|
78
82
|
extra_rdoc_files: []
|
79
83
|
files:
|
84
|
+
- README.md
|
80
85
|
- bin/image_filter_dsl
|
81
86
|
- lib/image_filter_dsl.rb
|
82
87
|
- lib/image_filter_dsl/binary/serialize.rb
|
@@ -86,11 +91,12 @@ files:
|
|
86
91
|
- lib/image_filter_dsl/dsl/kernel.rb
|
87
92
|
- lib/image_filter_dsl/engine/image_processor.rb
|
88
93
|
- lib/image_filter_dsl/engine/io.rb
|
89
|
-
homepage: https://bitbucket.org/WadeH/image_filter_dsl
|
94
|
+
homepage: https://bitbucket.org/WadeH/image_filter_dsl
|
90
95
|
licenses:
|
91
96
|
- MIT
|
92
97
|
metadata:
|
93
|
-
source_code_uri: https://bitbucket.org/WadeH/image_filter_dsl
|
98
|
+
source_code_uri: https://bitbucket.org/WadeH/image_filter_dsl
|
99
|
+
documentation_uri: https://rubydoc.info/gems/image_filter_dsl/0.1.0
|
94
100
|
post_install_message:
|
95
101
|
rdoc_options: []
|
96
102
|
require_paths:
|
@@ -106,8 +112,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
106
112
|
- !ruby/object:Gem::Version
|
107
113
|
version: '0'
|
108
114
|
requirements: []
|
109
|
-
|
110
|
-
rubygems_version: 2.7.8
|
115
|
+
rubygems_version: 3.0.1
|
111
116
|
signing_key:
|
112
117
|
specification_version: 4
|
113
118
|
summary: Image Filter DSL
|