1
0

added all the documentation

This commit is contained in:
Tim Kächele 2015-08-15 09:26:51 +02:00
parent a72b36cc20
commit 26bffa48b6
10 changed files with 124 additions and 13 deletions

View File

@ -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.

View File

@ -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

View File

@ -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|

View File

@ -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)

View File

@ -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|

View File

@ -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]

View File

@ -1,6 +1,18 @@
module EdgeDetect module EdgeDetect
##
# Sobel EdgeDetect Implementation
#
class SobelEdgeDetector < EdgeDetector class SobelEdgeDetector < EdgeDetector
def detect_edges
##
# 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
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],

View File

@ -1,3 +1,6 @@
module EdgeDetect module EdgeDetect
##
# The version of the gem
#
VERSION = "0.1.0" VERSION = "0.1.0"
end end

View File

@ -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]

View File

@ -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