中位切割演算法

算法的限制

因为每次循环区域的数量都会加倍，所以最终产生的颜色数量必定为2的幂次方。假如有特殊需要其它数量的颜色时，可以先产生超过需求的颜色数量，再合并多余的颜色直到符合所需的数量。

ruby

1 class Color 2   attr_reader :R, :G, :B 3   def initialize(r = rand(256), g = rand(256), b = rand(256)) 4     @R = r 5     @G = g 6     @B = b 7   end 8   def inspect 9     return "{R: #{@R}, G: #{@G}, B: #{@B}}"10   end11 end12 def get_colors(image_input, need_num)13   regions = [image_input.flatten]14   while regions.size < need_num15     new_regions = []16     for region in regions17       max_color = [:R, :G, :B].map{|color|18         colors = region.map(&color)19         next [colors.max - colors.min, color]20       }.max[1]21       new_order = region.sort_by(&max_color).reverse22       middle = new_order.size / 223       new_regions.push(new_order[0, middle], new_order[middle, middle + 1])24     end25     regions = new_regions26   end27   return regions.map{|region|28     next Color.new(*[:R, :G, :B].map{|color| (region.map(&color).inject(&:+) / region.size.to_f).round })29   }30 end31 get_colors(Array.new(10){ Array.new(10){ Color.new } }, 16)