added all the documentation
This commit is contained in:
parent
a72b36cc20
commit
26bffa48b6
@ -77,5 +77,5 @@ Bug reports and pull requests are welcome on GitHub at https://github.com/timkae
|
|||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
|
The gem is available as open source under the terms of the GNU GPL v2.
|
||||||
|
|
||||||
|
@ -9,3 +9,9 @@ require 'edge_detect/horizontal_differ'
|
|||||||
require 'edge_detect/vertical_differ'
|
require 'edge_detect/vertical_differ'
|
||||||
require 'edge_detect/edge_detector'
|
require 'edge_detect/edge_detector'
|
||||||
require 'edge_detect/sobel_edge_detector'
|
require 'edge_detect/sobel_edge_detector'
|
||||||
|
|
||||||
|
##
|
||||||
|
# EdgeDetection module
|
||||||
|
#
|
||||||
|
module EdgeDetect
|
||||||
|
end
|
@ -1,16 +1,37 @@
|
|||||||
module EdgeDetect
|
module EdgeDetect
|
||||||
|
|
||||||
|
##
|
||||||
|
# Abstract base class that provides the basis for both,
|
||||||
|
# the horizontal and vertical differ.
|
||||||
|
#
|
||||||
class Differ
|
class Differ
|
||||||
|
|
||||||
|
##
|
||||||
|
# Initializes a new differ with a given image
|
||||||
|
#
|
||||||
|
# @param image [ChunkyPNG::Image] the image that should be diffed
|
||||||
|
#
|
||||||
def initialize(image)
|
def initialize(image)
|
||||||
@image = image
|
@image = image
|
||||||
@gray_scaler = GrayScaler.new(image)
|
@gray_scaler = GrayScaler.new(image)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
##
|
||||||
|
# Should return the diffed value of the given pixel.
|
||||||
|
# If the pixel is out of bounds 0 should be returned.
|
||||||
|
#
|
||||||
|
# @return [Integer] a value between 0 and 255 representing a grayscale value.
|
||||||
|
#
|
||||||
def [](x, y)
|
def [](x, y)
|
||||||
raise NotImplementedError
|
raise NotImplementedError
|
||||||
end
|
end
|
||||||
|
|
||||||
|
##
|
||||||
|
# Returns the nearby diffs of the given coordinates (x, y) with respect to
|
||||||
|
# the given radius.
|
||||||
|
#
|
||||||
|
# @return [Array<Array<Integer>>] a two dimensional array with the diffs.
|
||||||
|
#
|
||||||
def nearby(x, y, radius)
|
def nearby(x, y, radius)
|
||||||
output = []
|
output = []
|
||||||
((x - radius)..(x + radius)).each do |i|
|
((x - radius)..(x + radius)).each do |i|
|
||||||
|
@ -2,14 +2,33 @@ require 'matrix'
|
|||||||
|
|
||||||
module EdgeDetect
|
module EdgeDetect
|
||||||
|
|
||||||
|
##
|
||||||
|
# Naive EdgeDetect Implementation
|
||||||
|
#
|
||||||
class EdgeDetector
|
class EdgeDetector
|
||||||
|
|
||||||
|
##
|
||||||
|
# The original image
|
||||||
|
#
|
||||||
attr_reader :image
|
attr_reader :image
|
||||||
|
|
||||||
|
##
|
||||||
|
# Initializes a new EdgeDetector with the given image.
|
||||||
|
#
|
||||||
|
# @param image [ChunkyPNG::Image] the image that should be edge detected.
|
||||||
|
#
|
||||||
def initialize(image)
|
def initialize(image)
|
||||||
@image = image
|
@image = image
|
||||||
end
|
end
|
||||||
|
|
||||||
|
##
|
||||||
|
# Edge detects the image by building the horizontal and vertical diffs.
|
||||||
|
# (naive approach)
|
||||||
|
#
|
||||||
|
# The original image will not be changed by this operation.
|
||||||
|
#
|
||||||
|
# @return [ChunkyPNG::Image] the edge detected image.
|
||||||
|
#
|
||||||
def detect_edges
|
def detect_edges
|
||||||
image = ChunkyPNG::Image.new(@image.width, @image.height, ChunkyPNG::Color::TRANSPARENT)
|
image = ChunkyPNG::Image.new(@image.width, @image.height, ChunkyPNG::Color::TRANSPARENT)
|
||||||
h_diff = HorizontalDiffer.new(self.image)
|
h_diff = HorizontalDiffer.new(self.image)
|
||||||
|
@ -1,10 +1,24 @@
|
|||||||
module EdgeDetect
|
module EdgeDetect
|
||||||
|
##
|
||||||
|
# Grayscales a given image
|
||||||
|
#
|
||||||
class GrayScaler
|
class GrayScaler
|
||||||
|
|
||||||
|
##
|
||||||
|
# Initializes a new GrayScaler with the given image
|
||||||
|
#
|
||||||
|
# @param image [ChunkyPNG::Image] the image that should be grayscaled.
|
||||||
|
#
|
||||||
def initialize(image)
|
def initialize(image)
|
||||||
@image = image
|
@image = image
|
||||||
end
|
end
|
||||||
|
|
||||||
|
##
|
||||||
|
# Returns the grayscale value of the given coordinate.
|
||||||
|
# If the coordinate is out of bounds 0 will be returned.
|
||||||
|
#
|
||||||
|
# @return [Integer] a value between 0 and 255.
|
||||||
|
#
|
||||||
def [](x, y)
|
def [](x, y)
|
||||||
begin
|
begin
|
||||||
(ChunkyPNG::Color.to_grayscale(@image[x, y]) & 0x0000ff00) >> 8
|
(ChunkyPNG::Color.to_grayscale(@image[x, y]) & 0x0000ff00) >> 8
|
||||||
@ -13,6 +27,12 @@ module EdgeDetect
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
##
|
||||||
|
# Returns the nearby grayscale values of the given coordinates (x, y) with
|
||||||
|
# respect to the given radius.
|
||||||
|
#
|
||||||
|
# @return [Array<Array<Integer>>] a two dimensional array with the grayscale values.
|
||||||
|
#
|
||||||
def nearby(x, y, radius)
|
def nearby(x, y, radius)
|
||||||
output = []
|
output = []
|
||||||
((x - radius)..(x + radius)).each do |i|
|
((x - radius)..(x + radius)).each do |i|
|
||||||
|
@ -1,8 +1,19 @@
|
|||||||
module EdgeDetect
|
module EdgeDetect
|
||||||
|
|
||||||
# Simple Datastructure to hold horizontal and vertical diffs as one object
|
##
|
||||||
|
# Diffs the image horizontal.
|
||||||
|
#
|
||||||
class HorizontalDiffer < Differ
|
class HorizontalDiffer < Differ
|
||||||
|
|
||||||
|
##
|
||||||
|
# Calculates the diff of the the given coordinate relative to the
|
||||||
|
# above pixel in the same column.
|
||||||
|
#
|
||||||
|
# The calculation is operated on the gray scale value of pixel
|
||||||
|
# If the given coordinate is out of bounds 0 (black) will be returned.
|
||||||
|
#
|
||||||
|
# @return [Integer] a value between 0 and 255
|
||||||
|
#
|
||||||
def [](x, y)
|
def [](x, y)
|
||||||
begin
|
begin
|
||||||
@gray_scaler[x, y] - @gray_scaler[x, y - 1]
|
@gray_scaler[x, y] - @gray_scaler[x, y - 1]
|
||||||
|
@ -1,5 +1,17 @@
|
|||||||
module EdgeDetect
|
module EdgeDetect
|
||||||
|
|
||||||
|
##
|
||||||
|
# Sobel EdgeDetect Implementation
|
||||||
|
#
|
||||||
class SobelEdgeDetector < EdgeDetector
|
class SobelEdgeDetector < EdgeDetector
|
||||||
|
|
||||||
|
##
|
||||||
|
# Edge detects the image by applying the sobel operations.
|
||||||
|
#
|
||||||
|
# The original image will not be changed by this operation.
|
||||||
|
#
|
||||||
|
# @return [ChunkyPNG::Image] the edge detected image.
|
||||||
|
#
|
||||||
def detect_edges
|
def detect_edges
|
||||||
image = ChunkyPNG::Image.new(@image.width, @image.height, ChunkyPNG::Color::TRANSPARENT)
|
image = ChunkyPNG::Image.new(@image.width, @image.height, ChunkyPNG::Color::TRANSPARENT)
|
||||||
gray = GrayScaler.new(self.image)
|
gray = GrayScaler.new(self.image)
|
||||||
@ -19,6 +31,11 @@ module EdgeDetect
|
|||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
|
##
|
||||||
|
# The sobel matrix to transform horizontal pixels
|
||||||
|
#
|
||||||
|
# @return [Matrix] the sobel matrix
|
||||||
|
#
|
||||||
def sobel_x
|
def sobel_x
|
||||||
@sobel_x ||= Matrix[
|
@sobel_x ||= Matrix[
|
||||||
[1, 0, -1],
|
[1, 0, -1],
|
||||||
@ -27,6 +44,11 @@ module EdgeDetect
|
|||||||
]
|
]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
##
|
||||||
|
# The sobel matrix to transform vertical pixels
|
||||||
|
#
|
||||||
|
# @return [Matrix] the sobel matrix
|
||||||
|
#
|
||||||
def sobel_y
|
def sobel_y
|
||||||
@sobel_y ||= Matrix[
|
@sobel_y ||= Matrix[
|
||||||
[1, 2, 1],
|
[1, 2, 1],
|
||||||
|
@ -1,3 +1,6 @@
|
|||||||
module EdgeDetect
|
module EdgeDetect
|
||||||
|
##
|
||||||
|
# The version of the gem
|
||||||
|
#
|
||||||
VERSION = "0.1.0"
|
VERSION = "0.1.0"
|
||||||
end
|
end
|
||||||
|
@ -1,8 +1,19 @@
|
|||||||
module EdgeDetect
|
module EdgeDetect
|
||||||
|
|
||||||
# Simple Datastructure to hold horizontal and vertical diffs as one object
|
##
|
||||||
|
# Diffs the image vertical.
|
||||||
|
#
|
||||||
class VerticalDiffer < Differ
|
class VerticalDiffer < Differ
|
||||||
|
|
||||||
|
##
|
||||||
|
# Calculates the diff of the the given coordinate relative to the
|
||||||
|
# above pixel in the same column.
|
||||||
|
#
|
||||||
|
# The calculation is operated on the gray scale value of pixel.
|
||||||
|
# If the given coordinate is out of bounds 0 (black) will be returned.
|
||||||
|
#
|
||||||
|
# @return [Integer] a value between 0 and 255
|
||||||
|
#
|
||||||
def [](x, y)
|
def [](x, y)
|
||||||
begin
|
begin
|
||||||
@gray_scaler[x, y] - @gray_scaler[x - 1, y]
|
@gray_scaler[x, y] - @gray_scaler[x - 1, y]
|
||||||
|
@ -3,7 +3,7 @@ require 'test_helper'
|
|||||||
class EdgeDetectorTest < Minitest::Test
|
class EdgeDetectorTest < Minitest::Test
|
||||||
|
|
||||||
|
|
||||||
def test_vertical_line
|
def test_airplane
|
||||||
input = File.expand_path('../../pictures/airplane.png', __FILE__)
|
input = File.expand_path('../../pictures/airplane.png', __FILE__)
|
||||||
image = ChunkyPNG::Image.from_file(input)
|
image = ChunkyPNG::Image.from_file(input)
|
||||||
|
|
||||||
@ -17,7 +17,7 @@ class EdgeDetectorTest < Minitest::Test
|
|||||||
sobel.detect_edges.save(output_sobel)
|
sobel.detect_edges.save(output_sobel)
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_horizontal_line
|
def test_robot
|
||||||
input = File.expand_path('../../pictures/robot.png', __FILE__)
|
input = File.expand_path('../../pictures/robot.png', __FILE__)
|
||||||
image = ChunkyPNG::Image.from_file(input)
|
image = ChunkyPNG::Image.from_file(input)
|
||||||
|
|
||||||
@ -31,6 +31,4 @@ class EdgeDetectorTest < Minitest::Test
|
|||||||
sobel.detect_edges.save(output_sobel)
|
sobel.detect_edges.save(output_sobel)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
end
|
end
|
Loading…
Reference in New Issue
Block a user