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