module Despeck::DominantColorV2

Finds average (?) 'colourful' colour

Public Class Methods

dominant_color(image) click to toggle source
# File lib/despeck/dominant_color_v2.rb, line 7
def dominant_color(image)
  image = image.resize(0.05)
  image_pixels = image.colourspace('srgb').to_a
  colors = []
  mask(image).to_a.each_with_index do |row, i|
    row.each_with_index do |pixel, j|
      next unless white_pixel?(pixel)

      colors << image_pixels[i][j]
    end
  end

  [average(colors, 0), average(colors, 1), average(colors, 2)]
end

Private Class Methods

average(pixels, channel) click to toggle source
# File lib/despeck/dominant_color_v2.rb, line 33
def average(pixels, channel)
  total = pixels.map { |i| i[channel] }.reduce(:+).to_f
  (total / pixels.count.to_f).to_i
end
mask(image, sens = 5) click to toggle source
# File lib/despeck/dominant_color_v2.rb, line 24
def mask(image, sens = 5)
  image = image.colourspace 'lch'
  (image[1] > sens)
end
white_pixel?(pixel) click to toggle source
# File lib/despeck/dominant_color_v2.rb, line 29
def white_pixel?(pixel)
  pixel.all? { |c| c >= 245 }
end