111

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

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

ただし、3 つの数値 ( R、G、B など) ではなく、数値 (0または など) のみを出力します。私は機能について何かを理解していないと思います。説明が欲しいです。160,60,60

どうもありがとう。

4

5 に答える 5

182

はい、このように:

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 の値の 1 つを参照しているためです。

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

ちなみに、あなたのコードは.jpg画像に対しては問題なく機能します。

于 2012-06-16T15:52:09.373 に答える
4

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

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

于 2012-06-16T15:52:49.763 に答える
2

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 !)

于 2016-07-24T09:02:55.227 に答える
2

イメージを変換する代わりに、パレットから 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)
于 2016-07-07T20:11:31.753 に答える