Sha256: 2bbdeac93b47fa8835b0c754c3fcf7539e70178e26c40d8ccf4aa8ac40d0a71f
Contents?: true
Size: 1.53 KB
Versions: 3
Compression:
Stored size: 1.53 KB
Contents
module PhotoMosaic class Image include Wisper::Publisher include MiniMagickXform include MiniMagickIo attr_reader :pixels, :width, :height, :foreign_image def initialize(pixels, foreign_image = nil) @pixels = pixels @width = pixels.first.size @height = pixels.size @foreign_image = foreign_image super end def ==(other) pixels == other.pixels end def find_match(images) min_msd = nil closest = nil images.each do |other| msd = msd(other) if min_msd.nil? || msd < min_msd min_msd = msd closest = other end end closest end def msd(other) pixels_a = pixels pixels_b = other.pixels mse = 0 pixels_a.each_with_index do |row, j| row.each_with_index do |pixel_a, i| pixel_b = pixels_b[j][i] || pixel_a mse += (pixel_a[0] - pixel_b[0])**2 + (pixel_a[1] - pixel_b[1])**2 + (pixel_a[2] - pixel_b[2])**2 end end mse end def squares(tile_width, tile_height) tile_count = (width / tile_width) * (height / tile_height) Enumerator.new(tile_count) do |yielder| column_indexes = (0...width).to_a @pixels.each_slice(tile_height) do |tile_rows| column_indexes.each_slice(tile_width) do |tile_column_indexes| tile = tile_rows.map { |row| row[tile_column_indexes.first..tile_column_indexes.last] } yielder << self.class.new(tile) end end end end end end
Version data entries
3 entries across 3 versions & 1 rubygems
Version | Path |
---|---|
photo_mosaic-0.1.5 | lib/photo_mosaic/image.rb |
photo_mosaic-0.1.4 | lib/photo_mosaic/image.rb |
photo_mosaic-0.1.3 | lib/photo_mosaic/image.rb |