似た色を求める

似た色をざっくりともとめる

色の科学といいますが、いろんなものがありますね。 RGBCMYKHSV色空間、HSBとか。

今回は、js の Canvas に画像情報をコピーしてきて、 線形探索で 1 ピクセルずつ色の判定をして一番使われている色を求めるということをするための前身としてどういうロジックにするか考えてみたときのメモです。

いくつか色のサンプル(基準色)を RGB で用意しておき、比較元の色をそれらとつきあわせて最も似た色を求めます。 基準とするのは次。

kijun = {
    '1': [0,0,0],
    '2': [0,0,255],
    '3': [0,255,0],
    '4': [255,0,0],
    '5': [0,255,255],
    '6': [255,0,255],
    '7': [255,255,0],
    '8': [255,255,255],
}

これを次のロジックで。

def main():
    # 比較する色
    mr = 200
    mg = 100
    mb = 100
    # キーに kijun のキー、値に色の2点間の距離
    distant_dict = {}
    for key in kijun:
        r,g,b = kijun[key]
        distance = math.sqrt((mr-r)*(mr-r)+(mg-g)*(mg-g)+(mb-b)*(mb-b))
        print(distance, kijun[key])
        distant_dict[key] = distance
    # 最も距離が近い(値が小さい)順に並べる
    srt_distance_dict = sorted(distant_dict.items(), key=lambda x:x[1])
    key,value = srt_distance_dict[0]
    # kijun[key] が判定された似た色
    print(key, kijun[key])

    # PIL で比較用に画像を作る
    # 画像のサイズ
    screen = (100,100)
    # 画像の背景色(RGB)
    bgcolor = tuple(kijun[key])
    # 保存するファイル名(ファイル形式は、拡張子から自動的に判別する)
    filename = "kijun.png"
    img = Image.new('RGB', screen,bgcolor)
    img.save(filename)
    # 画像の背景色(RGB)
    bgcolor = (mr,mg,mb)
    # 保存するファイル名(ファイル形式は、拡張子から自動的に判別する)
    filename = "original.png"
    img = Image.new('RGB', screen,bgcolor)
    img.save(filename)

基準の色の組み合わせを作る&色のサンプルは次で作る

def main():
    rgb_list = [
        0,64,127,190,255
    ]
    for c in itertools.product(rgb_list, rgb_list, rgb_list):
        print(c)
        # 画像のサイズ
        screen = (100,100)
        # 画像の背景色(RGB)
        bgcolor = c
        # 保存するファイル名(ファイル形式は、拡張子から自動的に判別する)
        filename = "r%d_g%d_b%d.png" % (bgcolor[0],bgcolor[1],bgcolor[2])
        img = Image.new('RGB', screen,bgcolor)
        img.save(filename)

参考サイト ActionScript入門Wiki - 近似色を探す - @ウィキモバイル

おわり。