magro 0.1.2 → 0.2.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 +5 -5
- data/.travis.yml +8 -3
- data/CHANGELOG.md +4 -0
- data/Gemfile +6 -1
- data/LICENSE.txt +1 -1
- data/README.md +3 -2
- data/lib/magro.rb +1 -0
- data/lib/magro/transform.rb +77 -0
- data/lib/magro/version.rb +1 -1
- data/magro.gemspec +0 -5
- metadata +4 -60
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 4e24a0d3e82248b27f8a652e84ebe382363234a082732af2b1c18a55ea0dc6c3
|
4
|
+
data.tar.gz: dc3bc91550338e59455d2ea51effcaf6934b0970c7169434a2cce7422c852252
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 000e7447d4f24a0dd6c97610c5c057ee96feb6eb0698a4e3564e7cec29ce6103a1ac3479f12a90fd1d1436ea89329418097197ad346879cc00018cca25e25aa0
|
7
|
+
data.tar.gz: f8a09aad3d5fcadc92e753a453213f8c33e66fbde0522a263afeb02b7a3ceaaf3245c6801f9d61bde41fe7015070391bd3cba8298dc2a1ca275e4ed4e110c60b
|
data/.travis.yml
CHANGED
@@ -1,5 +1,4 @@
|
|
1
1
|
---
|
2
|
-
sudo: true
|
3
2
|
os: linux
|
4
3
|
dist: bionic
|
5
4
|
language: ruby
|
@@ -8,7 +7,13 @@ rvm:
|
|
8
7
|
- '2.4'
|
9
8
|
- '2.5'
|
10
9
|
- '2.6'
|
10
|
+
- '2.7'
|
11
|
+
|
12
|
+
addons:
|
13
|
+
apt:
|
14
|
+
packages:
|
15
|
+
- libpng-dev
|
16
|
+
- libjpeg-dev
|
11
17
|
|
12
18
|
before_install:
|
13
|
-
-
|
14
|
-
- gem install bundler -v 2.0.2
|
19
|
+
- gem install bundler -v 2.1.4
|
data/CHANGELOG.md
CHANGED
data/Gemfile
CHANGED
data/LICENSE.txt
CHANGED
data/README.md
CHANGED
@@ -10,13 +10,14 @@ Magro uses [Numo::NArray](https://github.com/ruby-numo/numo-narray) arrays as im
|
|
10
10
|
|
11
11
|
## Installation
|
12
12
|
|
13
|
-
Magro dependents
|
13
|
+
Magro dependents libpng and libjpeg to provides functions loading image file.
|
14
|
+
It is recommended that using libpng version 1.6 or later.
|
14
15
|
|
15
16
|
macOS:
|
16
17
|
|
17
18
|
$ brew install libpng libjpeg
|
18
19
|
|
19
|
-
Ubuntu:
|
20
|
+
Ubuntu (bionic):
|
20
21
|
|
21
22
|
$ sudo apt-get install libpng-dev libjpeg-dev
|
22
23
|
|
data/lib/magro.rb
CHANGED
@@ -0,0 +1,77 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Magro
|
4
|
+
# Transform module provide functions of image transfom.
|
5
|
+
module Transform
|
6
|
+
module_function
|
7
|
+
|
8
|
+
# Resizes an image with bilinear interpolation method.
|
9
|
+
#
|
10
|
+
# @example
|
11
|
+
# require 'numo/narray'
|
12
|
+
# require 'magro'
|
13
|
+
#
|
14
|
+
# image = Numo::UInt8.new(16, 16).seq
|
15
|
+
# resized = Magro::Transform.resize(image, height: 64, width: 64)
|
16
|
+
#
|
17
|
+
# @param image [Numo::UInt8] (shape: [height, width, n_channels] or [height, width]) Image data to be saved.
|
18
|
+
# @param height [Integer] Requested height in pixels.
|
19
|
+
# @param width [Integer] Requested width in pixels.
|
20
|
+
# @return [Numo::UInt8] (shape: [height, width, n_channels] or [height, width]) Resized image data.
|
21
|
+
def resize(image, height:, width:)
|
22
|
+
n_channels = image.shape[2]
|
23
|
+
|
24
|
+
if n_channels.nil?
|
25
|
+
bilinear_resize(image, height, width)
|
26
|
+
else
|
27
|
+
resized = image.class.zeros(height, width, n_channels)
|
28
|
+
n_channels.times { |c| resized[true, true, c] = bilinear_resize(image[true, true, c], height, width) }
|
29
|
+
resized
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
# private
|
34
|
+
|
35
|
+
def bilinear_resize(image, new_height, new_width)
|
36
|
+
height, width = image.shape
|
37
|
+
|
38
|
+
y_ratio = height.fdiv(new_height)
|
39
|
+
x_ratio = width.fdiv(new_width)
|
40
|
+
|
41
|
+
y, x = Numo::Int32.new(new_height * new_width).seq.divmod(new_width)
|
42
|
+
|
43
|
+
y_p = Numo::Int32.cast((y_ratio * (y + 0.5) - 0.5).floor).clip(0, height - 1)
|
44
|
+
x_p = Numo::Int32.cast((x_ratio * (x + 0.5) - 0.5).floor).clip(0, width - 1)
|
45
|
+
y_n = Numo::Int32.cast((y_ratio * (y + 0.5) - 0.5).ceil).clip(0, height - 1)
|
46
|
+
x_n = Numo::Int32.cast((x_ratio * (x + 0.5) - 0.5).ceil).clip(0, width - 1)
|
47
|
+
|
48
|
+
flt = image.flatten
|
49
|
+
a = flt[y_p * width + x_p]
|
50
|
+
b = flt[y_p * width + x_n]
|
51
|
+
c = flt[y_n * width + x_p]
|
52
|
+
d = flt[y_n * width + x_n]
|
53
|
+
|
54
|
+
y_d = y_ratio * (y + 0.5) - 0.5
|
55
|
+
x_d = x_ratio * (x + 0.5) - 0.5
|
56
|
+
y_d = y_d.class.maximum(0, y_d - y_d.floor)
|
57
|
+
x_d = x_d.class.maximum(0, x_d - x_d.floor)
|
58
|
+
|
59
|
+
resized = a * (1 - x_d) * (1 - y_d) + b * x_d * (1 - y_d) + c * (1 - x_d) * y_d + d * x_d * y_d
|
60
|
+
|
61
|
+
resized = resized.ceil.clip(image.class::MIN, image.class::MAX) if integer_narray?(image)
|
62
|
+
resized = image.class.cast(resized) unless resized.is_a?(image.class)
|
63
|
+
resized.reshape(new_height, new_width)
|
64
|
+
end
|
65
|
+
|
66
|
+
INTEGER_NARRAY = %w[Numo::Int8 Numo::Int16 Numo::Int32 Numo::Int64
|
67
|
+
Numo::UInt8 Numo::UInt16 Numo::UInt32 Numo::UInt64].freeze
|
68
|
+
|
69
|
+
private_constant :INTEGER_NARRAY
|
70
|
+
|
71
|
+
def integer_narray?(image)
|
72
|
+
INTEGER_NARRAY.include?(image.class.to_s)
|
73
|
+
end
|
74
|
+
|
75
|
+
private_class_method :bilinear_resize, :integer_narray?
|
76
|
+
end
|
77
|
+
end
|
data/lib/magro/version.rb
CHANGED
data/magro.gemspec
CHANGED
@@ -26,9 +26,4 @@ Gem::Specification.new do |spec|
|
|
26
26
|
spec.extensions = ['ext/magro/extconf.rb']
|
27
27
|
|
28
28
|
spec.add_runtime_dependency 'numo-narray', '~> 0.9.1'
|
29
|
-
|
30
|
-
spec.add_development_dependency 'bundler', '~> 2.0'
|
31
|
-
spec.add_development_dependency 'rake', '~> 10.0'
|
32
|
-
spec.add_development_dependency 'rake-compiler', '~> 1.0'
|
33
|
-
spec.add_development_dependency 'rspec', '~> 3.0'
|
34
29
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: magro
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- yoshoku
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-05-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: numo-narray
|
@@ -24,62 +24,6 @@ dependencies:
|
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: 0.9.1
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: bundler
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - "~>"
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: '2.0'
|
34
|
-
type: :development
|
35
|
-
prerelease: false
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
37
|
-
requirements:
|
38
|
-
- - "~>"
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
version: '2.0'
|
41
|
-
- !ruby/object:Gem::Dependency
|
42
|
-
name: rake
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
44
|
-
requirements:
|
45
|
-
- - "~>"
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: '10.0'
|
48
|
-
type: :development
|
49
|
-
prerelease: false
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
51
|
-
requirements:
|
52
|
-
- - "~>"
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: '10.0'
|
55
|
-
- !ruby/object:Gem::Dependency
|
56
|
-
name: rake-compiler
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
58
|
-
requirements:
|
59
|
-
- - "~>"
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: '1.0'
|
62
|
-
type: :development
|
63
|
-
prerelease: false
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
65
|
-
requirements:
|
66
|
-
- - "~>"
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version: '1.0'
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: rspec
|
71
|
-
requirement: !ruby/object:Gem::Requirement
|
72
|
-
requirements:
|
73
|
-
- - "~>"
|
74
|
-
- !ruby/object:Gem::Version
|
75
|
-
version: '3.0'
|
76
|
-
type: :development
|
77
|
-
prerelease: false
|
78
|
-
version_requirements: !ruby/object:Gem::Requirement
|
79
|
-
requirements:
|
80
|
-
- - "~>"
|
81
|
-
- !ruby/object:Gem::Version
|
82
|
-
version: '3.0'
|
83
27
|
description: Magro is an image processing library for Ruby.
|
84
28
|
email:
|
85
29
|
- yoshoku@outlook.com
|
@@ -106,6 +50,7 @@ files:
|
|
106
50
|
- ext/magro/magro.h
|
107
51
|
- lib/magro.rb
|
108
52
|
- lib/magro/io.rb
|
53
|
+
- lib/magro/transform.rb
|
109
54
|
- lib/magro/version.rb
|
110
55
|
- magro.gemspec
|
111
56
|
homepage: https://github.com/yoshoku/magro
|
@@ -127,8 +72,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
127
72
|
- !ruby/object:Gem::Version
|
128
73
|
version: '0'
|
129
74
|
requirements: []
|
130
|
-
|
131
|
-
rubygems_version: 2.6.14.4
|
75
|
+
rubygems_version: 3.1.2
|
132
76
|
signing_key:
|
133
77
|
specification_version: 4
|
134
78
|
summary: Magro is an image processing library for Ruby.
|