回答:
はい、この方法:
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投稿も参照してください:GIFとJPEGで異なるPythonとPILのピクセル値。このPILリファレンスページに は、convert()
関数の詳細が含まれています。
ちなみに、コードは.jpg
画像に対しては問題なく機能します。
GIFは、色をパレットのx可能な色の1つとして格納します。gif限定カラーパレットについてお読みください。したがって、PILはパレットの色の色情報ではなく、パレットのインデックスを提供します。
編集:タイプミスがあったブログ投稿ソリューションへのリンクを削除しました。他の答えはタイプミスなしで同じことをします。
画像を変換する代わりに、パレットから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)
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.imread
さscipyのダウンロード1.0.0で非推奨(リマインダー、に感謝fbahrを!)
scipy.misc.imread
廃止予定です!imread
はSciPy 1.0.0で廃止され、1.2.0で削除されます。imageio.imread
代わりに使用してください。