module Despeck::DominantColor

Finds primary watermark colour (red, green, or blue)

Public Class Methods

dominant_color(image) click to toggle source
# File lib/despeck/dominant_color.rb, line 7
def dominant_color(image)
  color_pixels = non_black_colors(image)
  primary_color(color_pixels)
end

Private Class Methods

black_and_white?(pixel) click to toggle source
# File lib/despeck/dominant_color.rb, line 49
def black_and_white?(pixel)
  average = pixel.reduce(:+) / pixel.count
  min = average - 30
  max = average + 30
  pixel.all? { |i| min <= i && i <= max }
end
calculate_channels_total(colors) click to toggle source
# File lib/despeck/dominant_color.rb, line 32
def calculate_channels_total(colors)
  red, green, blue = 0, 0, 0
  colors.each do |pixel|
    r, g, b = pixel
    case pixel.max
    when r
      red += 1
    when g
      green += 1
    when b
      blue += 1
    end
  end

  [red, green, blue]
end
non_black_colors(image) click to toggle source
# File lib/despeck/dominant_color.rb, line 14
def non_black_colors(image)
  pixels = image.resize(0.02).to_a
  pixels.flatten(1).reject { |p| black_and_white?(p) }
end
primary_color(colors) click to toggle source
# File lib/despeck/dominant_color.rb, line 19
def primary_color(colors)
  red, green, blue = calculate_channels_total(colors)

  case [red, green, blue].max
  when red
    'FF0000'
  when green
    '00FF00'
  when blue
    '0000FF'
  end
end