web-dev-qa-db-ja.com

PILを使用してピクセルのRGBを取得

PILを使用してピクセルのRGBカラーを取得することは可能ですか?私はこのコードを使用しています:

im = Image.open("image.gif")
pix = im.load()
print(pix[1,1])

ただし、数値(例:0または1)のみが出力され、3つの数(例:R、G、Bの場合は60,60,60)は出力されません。私は機能について何かを理解していないと思います。説明をお願いします。

どうもありがとう。

78
GermainZ

はい、この方法:

im = Image.open('image.gif')
rgb_im = im.convert('RGB')
r, g, b = rgb_im.getpixel((1, 1))

print(r, g, b)
(65, 100, 137)

以前にpix[1, 1]で単一の値を取得していた理由は、GIFピクセルがGIFカラーパレットの256個の値のいずれかを参照するためです。

こちらのSO投稿もご覧ください: GIFとJPEGで異なるPythonとPILピクセル値 とこれ PILリファレンスページ には、convert()関数の詳細が含まれています。

ところで、あなたのコードは.jpg画像に対してうまく動作します。

127
Levon

GIFは、パレット内のx個の可能な色の1つとして色を保存します。 gif限定カラーパレット についてお読みください。そのため、PILはそのパレット色の色情報ではなく、パレットインデックスを提供します。

編集:タイプミスのあったブログ投稿ソリューションへのリンクを削除しました。他の答えは、タイプミスなしで同じことをします。

3
KobeJohn

PILではありませんが、 imageio.imread はまだ興味深いかもしれません:

import imageio
im = scipy.misc.imread('um_000000.png', flatten=False, mode='RGB')
im = imageio.imread('Figure_1.png', pilmode='RGB')
print(im.shape)

与える

(480, 640, 3)

そのため(高さ、幅、チャネル)です。したがって、位置(x, y)のピクセルは

color = Tuple(im[y][x])
r, g, b = color

時代遅れ

scipy.misc.imreadSciPy 1.0.0で非推奨 (リマインダーをありがとう、 fbahr !)

2
Martin Thoma

画像を変換する代わりに、パレットからRGBインデックスを作成することもできます。

from PIL import Image

def chunk(seq, size, groupByList=True):
    """Returns list of lists/tuples broken up by size input"""
    func = Tuple
    if groupByList:
        func = list
    return [func(seq[i:i + size]) for i in range(0, len(seq), size)]


def getPaletteInRgb(img):
    """
    Returns list of RGB tuples found in the image palette
    :type img: Image.Image
    :rtype: list[Tuple]
    """
    assert img.mode == 'P', "image should be palette mode"
    pal = img.getpalette()
    colors = chunk(pal, 3, False)
    return colors

# Usage
im = Image.open("image.gif")
pal = getPalletteInRgb(im)
1
Marcel Wilson