1

私は、科学論文の図から情報を抽出することに取り組んでおり、図自体の画像処理とキャプションの自然言語処理を組み合わせています。

画像内のオブジェクトを分離し、それぞれの「平均的な」色を取得する段階に達しました (RGB と Lab の両方の色空間で、何が最適かはまだわかりません)。キャプションから、オブジェクトのリストと、それらを説明するために使用される色の名前を解析しました。

だから私は2つのリストを持っています:

names = ['Red', 'Brown', 'Yellow', 'Magenta'];
rgbs = [ (249,0,252), (253,0,1), (250,248,60), (140,70,20)];

名前と値の最適な組み合わせを自動的に決定する方法を見つけようとしています。それについて考えると、すべての一般的な名前のルックアップ テーブルを使用して、名前を「受け入れられる」RGB 値に変換することから始めるのが最善であると思います。次に、各 rgb 値と各名前 rgb の間の「距離」(ユークリッド?) を計算できます。この段階で、これらの距離を使用して最適な組み合わせを見つけることができるはずですが、正確な方法はわかりません。

誰かがアイデアを持っているか、これに役立つツールを提供する可能性のあるライブラリを知っていますか?

4

2 に答える 2

2

この作品を読んでみてください。それは非常によく似た問題を解決しているように見えます。

さまざまな図からそのようなリストペア(名前-RGB値)を取得できますか?
もしそうなら、これらのリストを交差させることによって、あなたはペアの束に共通の色名(この色のみ)を分離し、次に「可能な限り共通」であるRGBトリプレットを見つけようとするかもしれません(最大少し歪み)。
すべての色を分離するまで、この除去プロセスを使用できます。

例:あなたが持っているとしましょう

{ ['Red','Green'], {[1 0 0], [0 1 0]} }
{ ['Red','blue'] , {[.9 .1. 1], [ .2 .3 .9] }

交差点に「赤」があり、[1 0 0]、[。9.1.1]最も近い色があります。

于 2013-02-05T16:27:09.170 に答える
1

たまたま value->name 関数も必要だったので、ここの投稿が役に立ちました。しかし、これは私が思いついたものです:

from bs4 import BeautifulSoup
import requests
import sys 

def squ_diff(c1, c2):
    return ((c1 & 0x0000FF) - (c2 & 0x0000FF))**2 +\
           (((c1 & 0x00FF00)>>8) - ((c2 & 0x00FF00)>>8))**2 +\
           (((c1 & 0xFF0000)>>16) - ((c2 & 0xFF0000)>>16))**2

def best_match(c, ref):
    """Find the best match for color c.
    Uses least square to determine fitness.
    """
    diff = squ_diff(0xFFFFFF, 0x000000)
    best = "None"
    for ref_color in ref:
        curr_diff = squ_diff(c, ref_color[1])
        #if curr_diff < 1000:
        #    print curr_diff, ref_color[0], hex(ref_color[1])
        if curr_diff < diff:
            diff = curr_diff
            best = ref_color[0]
    return best

def get_ref():
    """Retreives some reference colors.
    Format:
        [("red", 0xFF0000), ("green", 0x00FF00), ("blue", 0x0000FF)]
    """
    html = requests.get("http://jadecat.com/tuts/colorsplus.html").content
    soup = BeautifulSoup(html)
    return [(e.text[:-6].strip(), int(e.text[-6:], 16)) for e in soup.find_all("td")[2:]]

if __name__ == "__main__":
    """For testing, just provide a hex value as the argument.
    """
    r = get_ref()
    print best_match(int(sys.argv[1], 16), r)

指定された参照テーブル (インターネットから 1 つだけ取り出したもの) の最小二乗差を計算して、名前と指定された色の値をペアにします。人間の色の知覚に適応する限り、私は実際には多くの科学を行いませんでしたが、私が得たものはかなりうまく機能します. スコア関数を好きなように変更できるので、これが誰かの役に立てば幸いです。

ただし、Shai が参照している作業は非常に興味深いものであり、私のアルゴリズムは一部の色で失敗するはずです。ただし、この方法の背後にある考え方は、この影響を最小限に抑えるために、できるだけ多くの色に名前を付けることです。たとえば、複数の色の値を「赤」にマップすることもできます。

于 2013-12-26T21:16:31.997 に答える