image_filter_dsl 0.0.5 → 0.0.6
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 +153 -26
- data/lib/image_filter_dsl/dsl/filter_instructions.rb +30 -3
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f36219d0037d3f5d26ca5d4aa9c06465964094c89afe256ad3d79e63dda611d6
|
4
|
+
data.tar.gz: 310be0964d3c2f293b43c2022437effbdefa1df00588d27b36743642c0502ac8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: db69c17700799b782c73169fab41f56fcec07ba2695dcb15815eb8aa53944bc65af5684205a09f0bdc99164e01a6e24939fb15603375fd0cfc2991422bdcfa7a
|
7
|
+
data.tar.gz: 9b765299f432bab3d67d40ce3e29568461409ec83b394cb248979b4826d73dfe5e9a4c04d4a52c69208d73e4bcf863fe224d61029f5379d235eaae0d2bf89457
|
data/README.md
CHANGED
@@ -4,48 +4,175 @@ _An Image Filter DSL (duh)_
|
|
4
4
|
|
5
5
|
[](https://badge.fury.io/rb/image_filter_dsl)
|
6
6
|
|
7
|
+
{file:CHANGELOG.md Change Log}
|
8
|
+
|
7
9
|
## Features
|
8
10
|
|
9
11
|
- DSL with customizable input and output variables, and a set of basic instructions
|
10
12
|
- IO with serialization so Kernels can be written to binary files and loaded from binary files
|
11
13
|
- Image Processor that generates image file by applying Filter Kernel to every pixel of input image (supports multi-threading)
|
12
14
|
|
15
|
+
## DSL
|
16
|
+
|
17
|
+
### Filter Block
|
18
|
+
|
19
|
+
Using `ImageFilterDsl::Dsl::Filter`
|
20
|
+
|
21
|
+
|
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 (4 values) `[n1,n1,true_val,false_val]`
|
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 (4 values) `[n1,n1,true_val,false_val]`
|
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
|
+
- `switch` choose one of two values based on condition value (1/1.0 = true, 0/0.0 = false) `[cond,true_val,false_val]`
|
115
|
+
|
116
|
+
```ruby
|
117
|
+
# If c is true, store r in a, else store g in a
|
118
|
+
switch [:c,:r,:g], :a
|
119
|
+
```
|
120
|
+
|
121
|
+
- `eq` if two input values are equal, store 1, else 0 (`[val1,val2]`)
|
122
|
+
- `bnot` if input is 1 or 1.0, store 0, else 1 (`[bool]`)
|
123
|
+
- `copy` copy input directly to output (`[src]`)
|
124
|
+
- `ceil` nearest whole integer of input, rounded up (`[val]`)
|
125
|
+
- `float` cast input to float (`[val]`)
|
126
|
+
- `round` round first input value to second value decimals (`[value,decimal_count]`)
|
127
|
+
- `mix` Mix two values together with a ratio (0*a + (1-r)*b) (`[ratio,a,b]`)
|
128
|
+
|
129
|
+
```ruby
|
130
|
+
# store (0.3*r) + (0.7*g) in b
|
131
|
+
mix [0.3,:r,:g], :b
|
132
|
+
```
|
133
|
+
|
134
|
+
__Generators__
|
135
|
+
|
136
|
+
- `rand` random float between min and max (`[min,max]`)
|
137
|
+
- `sin` sine function on single value
|
138
|
+
- `cos` cosine function on single value
|
139
|
+
- `tan` tangent function on single value
|
140
|
+
|
13
141
|
### Sample
|
14
142
|
|
15
143
|
Define filter
|
16
144
|
|
17
|
-
|
18
|
-
swizzle = Filter.define [:r,:g,:b], [:r,:g,:b] do
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
end
|
24
|
-
|
145
|
+
<!--```ruby-->
|
146
|
+
swizzle = Filter.define [:r,:g,:b], [:r,:g,:b] do
|
147
|
+
copy [:g], :t # copy green to temp
|
148
|
+
copy [:r], :g # copy red to green
|
149
|
+
copy [:b], :r # copy blue to red
|
150
|
+
copy [:t], :b # copy temp (original green) to blue
|
151
|
+
end
|
152
|
+
<!--```-->
|
25
153
|
|
26
154
|
Optionally write filter kernal to binary file on disk
|
27
155
|
|
28
|
-
|
29
|
-
ImageFilterDsl::Engine::IO.write("./swizzle.
|
30
|
-
|
156
|
+
<!--```ruby-->
|
157
|
+
ImageFilterDsl::Engine::IO.write("./swizzle.ifdk", swizzle)
|
158
|
+
<!--```-->
|
31
159
|
|
32
160
|
Use filter kernal to process image
|
33
161
|
|
34
|
-
|
35
|
-
# From binary kernal file
|
36
|
-
processor = ImageFilterDsl::Engine::ImageProcessor.new('./swizzle.ifdk')
|
37
|
-
# OR from filter object
|
38
|
-
processor = ImageFilterDsl::Engine::ImageProcessor.new(swizzle)
|
39
|
-
# or use aliases in main module
|
40
|
-
processor = ImageFilterDsl.image_processor(swizzle)
|
41
|
-
|
42
|
-
# Process image and store output
|
43
|
-
processor.process_image('./my_source.png', './my_output.png')
|
44
|
-
|
45
|
-
|
46
|
-
- See
|
47
|
-
- See
|
48
|
-
- See Also: [image_filter_dsl_samples](https://bitbucket.org/WadeH/image_filter_dsl_samples/src/master/) for samples
|
162
|
+
<!--```ruby-->
|
163
|
+
# From binary kernal file
|
164
|
+
processor = ImageFilterDsl::Engine::ImageProcessor.new('./swizzle.ifdk')
|
165
|
+
# OR from filter object
|
166
|
+
processor = ImageFilterDsl::Engine::ImageProcessor.new(swizzle)
|
167
|
+
# or use aliases in main module
|
168
|
+
processor = ImageFilterDsl.image_processor(swizzle)
|
169
|
+
|
170
|
+
# Process image and store output
|
171
|
+
processor.process_image('./my_source.png', './my_output.png')
|
172
|
+
<!--```-->
|
173
|
+
|
174
|
+
- See `./sample_filters/samples.rb` for sample filters
|
175
|
+
- See Also: [image_filter_dsl_samples](https://bitbucket.org/WadeH/image_filter_dsl_samples/src/master/) for more samples
|
49
176
|
|
50
177
|
## Gem
|
51
178
|
|
@@ -5,7 +5,7 @@
|
|
5
5
|
module ImageFilterDsl
|
6
6
|
##
|
7
7
|
# Module defining DSL
|
8
|
-
# {include:file:
|
8
|
+
# {include:file:dsl.md}
|
9
9
|
module Dsl
|
10
10
|
##
|
11
11
|
# Module defining filter kernel instruction logic
|
@@ -37,7 +37,10 @@ module ImageFilterDsl
|
|
37
37
|
bnot: 0xd9,
|
38
38
|
mix: 0xda,
|
39
39
|
# generation
|
40
|
-
rand:
|
40
|
+
rand: 0xf0,
|
41
|
+
sin: 0xf1,
|
42
|
+
cos: 0xf2,
|
43
|
+
tan: 0xf3
|
41
44
|
}
|
42
45
|
|
43
46
|
##
|
@@ -192,7 +195,7 @@ module ImageFilterDsl
|
|
192
195
|
##
|
193
196
|
# 'Switch' instruction (basically if)
|
194
197
|
#
|
195
|
-
# switch
|
198
|
+
# switch condition (0/1/0.0/1.0), trueval, falseval]
|
196
199
|
# @param [Array] i input value (condition, true val, false val)
|
197
200
|
# @return [Integer|Float] output value
|
198
201
|
def self.switch(i)
|
@@ -245,6 +248,30 @@ module ImageFilterDsl
|
|
245
248
|
min,max = i
|
246
249
|
(-min) + (r.rand * (max + min))
|
247
250
|
end
|
251
|
+
|
252
|
+
##
|
253
|
+
# Sine function
|
254
|
+
# @param [Array] i input value to use sin on
|
255
|
+
# @return [Float] Sine of input value
|
256
|
+
def self.sin(i)
|
257
|
+
Math.sin(i[0])
|
258
|
+
end
|
259
|
+
|
260
|
+
##
|
261
|
+
# Cosine function
|
262
|
+
# @param [Array] i input value to use cos on
|
263
|
+
# @return [Float] Cosine of input value
|
264
|
+
def self.cos(i)
|
265
|
+
Math.cos(i[0])
|
266
|
+
end
|
267
|
+
|
268
|
+
##
|
269
|
+
# Tangent function
|
270
|
+
# @param [Array] i input value to use tan on
|
271
|
+
# @return [Float] Tangent of input value
|
272
|
+
def self.tan(i)
|
273
|
+
Math.tan(i[0])
|
274
|
+
end
|
248
275
|
end
|
249
276
|
end
|
250
277
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
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.0.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Wade H.
|
@@ -96,6 +96,7 @@ licenses:
|
|
96
96
|
- MIT
|
97
97
|
metadata:
|
98
98
|
source_code_uri: https://bitbucket.org/WadeH/image_filter_dsl
|
99
|
+
documentation_uri: https://rubydoc.info/gems/image_filter_dsl/0.0.6
|
99
100
|
post_install_message:
|
100
101
|
rdoc_options: []
|
101
102
|
require_paths:
|
@@ -111,7 +112,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
111
112
|
- !ruby/object:Gem::Version
|
112
113
|
version: '0'
|
113
114
|
requirements: []
|
114
|
-
|
115
|
+
rubyforge_project:
|
116
|
+
rubygems_version: 2.7.8
|
115
117
|
signing_key:
|
116
118
|
specification_version: 4
|
117
119
|
summary: Image Filter DSL
|