1

正確に22色(それぞれが異なるRGB値を持つ)の画像(.tiffまたはgeotiffファイル)が与えられた場合、それぞれが特定のRGBのピクセルのみを含む22の別々の画像にそれらを分離(「フィルタリング」)するためのアプローチは何ですか価値?

4

1 に答える 1

5

これをピクセル単位で行う方法を次に示します。これは、画像内の任意の数の色に対して機能します(ただし、多くの色や大きな画像では遅くなる可能性があります)。また、パレット画像に対しても機能します(それらを変換します)。

import Image

def color_separator(im):
    if im.getpalette():
        im = im.convert('RGB')

    colors = im.getcolors()
    width, height = im.size
    colors_dict = dict((val[1],Image.new('RGB', (width, height), (0,0,0))) 
                        for val in colors)
    pix = im.load()    
    for i in xrange(width):
        for j in xrange(height):
            colors_dict[pix[i,j]].putpixel((i,j), pix[i,j])
    return colors_dict

im = Image.open("colorwheel.tiff")
colors_dict = color_separator(im)
#show the images:
colors_dict.popitem()[1].show()
colors_dict.popitem()[1].show()
  1. を呼び出すim.getcolors()と、色の数が最大値(指定可能で、デフォルトは256)を超えない限り、画像内のすべての色とそれらが発生する回数のリストがタプルとして返されます。
  2. colors_dict次に、画像の色と、対応する空の画像の値をキーにした辞書を作成します。
  3. 次に、すべてのピクセルの画像を反復処理し、各ピクセルの適切な辞書エントリを更新します。このようにすると、画像を1回だけ読み取る必要があります。load()画像を読み取るときに、ピクセルアクセスを高速化するために使用します。
  4. color_separator()画像内のすべての一意の色でキー設定された画像の辞書を返します。

高速化するにはload()、のすべての画像に使用できcolors_dictますが、画像の色が多くて大きい場合はメモリを大量に消費する可能性があるため、少し注意が必要な場合があります。これが問題ではない場合は、(の作成後にcolors_dict)追加します。

fast_colors = dict((key, value.load()) for key, value in colors_dict.items())

と交換:

colors_dict[pix[j,i]].putpixel((j,i), pix[j,i])

にとって:

fast_colors[pix[j,i]][j,i] = pix[j,i]

22色の画像:ここに画像の説明を入力してください

22色の分離画像:

ここに画像の説明を入力してください ここに画像の説明を入力してください ここに画像の説明を入力してください ここに画像の説明を入力してください ここに画像の説明を入力してください ここに画像の説明を入力してください ここに画像の説明を入力してください ここに画像の説明を入力してください ここに画像の説明を入力してください ここに画像の説明を入力してください ここに画像の説明を入力してください ここに画像の説明を入力してください ここに画像の説明を入力してください ここに画像の説明を入力してください ここに画像の説明を入力してください ここに画像の説明を入力してください ここに画像の説明を入力してください ここに画像の説明を入力してください ここに画像の説明を入力してください ここに画像の説明を入力してください ここに画像の説明を入力してください ここに画像の説明を入力してください

于 2012-04-06T13:54:54.283 に答える