PILを使用してピクセルのRGBカラーを取得することは可能ですか?私はこのコードを使用しています:
im = Image.open("image.gif")
pix = im.load()
print(pix[1,1])
ただし、数値(例:0
または1
)のみが出力され、3つの数(例:R、G、Bの場合は60,60,60
)は出力されません。私は機能について何かを理解していないと思います。説明をお願いします。
どうもありがとう。
はい、この方法:
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
画像に対してうまく動作します。
GIFは、パレット内のx個の可能な色の1つとして色を保存します。 gif限定カラーパレット についてお読みください。そのため、PILはそのパレット色の色情報ではなく、パレットインデックスを提供します。
編集:タイプミスのあったブログ投稿ソリューションへのリンクを削除しました。他の答えは、タイプミスなしで同じことをします。
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 !)
画像を変換する代わりに、パレットから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)