2009-03-24 5 views
3

私はPythonとPILを使用しています。RGB画像に1色しか含まれていないかどうかを確認するにはどうすればいいですか?

RGBの画像がありますが、1色(例:#FF0000)または非常に近い色(#FF0000と#FF0001)しか含まれていない人を知りたいと思います。

私はヒストグラムを使用することを考えていましたが、3色のバンドで何かを見つけ出すことは非常に難しいので、もっと巧妙なアルゴリズムを探しています。

アイデア?

ImageStatモジュールが答えです!アロンに感謝します。 私はImageStat.varを使用して分散を取得し、完全に動作します。ここで

はコードの私の作品です:

from PIL import Image, ImageStat 

MONOCHROMATIC_MAX_VARIANCE = 0.005 

def is_monochromatic_image(src): 
    v = ImageStat.Stat(Image.open(src)).var 
    return reduce(lambda x, y: x and y < MONOCHROMATIC_MAX_VARIANCE, v, True) 

答えて

4

ImageStat moduleをお試しください。 extremaによって返される値が同じ場合、画像には1つの色しかありません。ここで

0

まず、あなたは、2つの色の間の距離を定義する必要があります。 次に、各ピクセルごとに色の距離が十分に小さいことを確認するだけです。

+0

3次元RGB空間の各ピクセル間のユークリッド距離を理論的には理論上は良いですが、私はそれが数百万ピクセルの画像ではうまくいかないと思っています...(少なくともPythonで) –

+0

なぜユークリッド距離ですか?あなたが望むものに応じて何か他のものを想像することができます。 – SmuK

+0

問題は距離のタイプではなく、アルゴリズムがO(N^2)であるという事実にあります.Nは画像のピクセル数です(N = 10,000,000の場合があります) –

0

は、あなたが利用することができ、ほとんどの抜粋です:


import Image 

im = Image.open("path_to_image") 
width,height = im.size 

for w in range(0,width): 
    for h in range(0,height): 
    # this will hold the value of all the channels 
    color_tuple = im.getpixel((w,h)) 
    # do something with the colors here 

たぶん、ハッシュを使用して、キーとしてタプルを格納し、それが値として出現回数は?

関連する問題