RMagickで特定の色を基準に色置換をしてみた。

画像。
指定したRGB値を基準に色を置換する。
特定の色だけ自然な感じで変えたい時に使える。かもしれない。

require 'rubygems'
require "RMagick"

include Magick

def colorconvert(image, filename, r, g, b)

# 置換するRGB値
cr = 255
cg = 255
cb = 220

img = ImageList.new(image)
for y in 0...img.rows
  for x in 0...img.columns
    src = img.pixel_color(x, y)

    dr = src.red - r
    dg = src.green - g
    db = src.blue - b

# 基準RGB値からの色距離(基準色からどれだけ離れているか)を算出
    d = Math::sqrt(dr*dr + dg*dg + db*db)

# 影響力調整
    d = d / 200

# 基準RGB値に近い(色距離が小さい)ほど、RGB値補正の影響を大きく受ける
    if d <= 1
      nr = src.red - ((src.red-cr) * (1-d)*(1-d))
      ng = src.green - ((src.green-cg) * (1-d)*(1-d))
      nb = src.blue - ((src.blue-cb) * (1-d)*(1-d))
      color = Magick::Pixel.new(nr, ng, nb)
      img.pixel_color(x, y, color)
    end
  end
end

img.write filename
end

image = ARGV[0]
filename = ARGV[1]

# 基準RGB値
r = ARGV[2]
g = ARGV[3]
b = ARGV[4]
colorconvert(image, filename, r.to_i, g.to_i, b.to_i)

今回の実験画像はこちら。
エキゾチックなハイスクールブシドー、シノブさんです。
今回はその褐色の肌を基準値にしてみます。

ruby ./colorconvert.rb image/shinobu.jpg shinobu_convert.jpg 129 112 102

結果。美白処理!

おまけ。
ホリーさんの服だけ色を変えたりとかも出来る。