[python] PIL을 사용하여 픽셀의 RGB 얻기

PIL을 사용하여 픽셀의 RGB 색상을 얻을 수 있습니까? 이 코드를 사용하고 있습니다.

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

그러나 3 개의 숫자 (예 : R, G, B)가 아닌 숫자 (예 : 0또는 1) 만 출력합니다 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 개의 색상 중 하나로 저장합니다. 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한다 1.0.0 SciPy에서 사용되지 않는 (감사 알림에 대한 fbahr !)


답변

numpy 사용 :

im = Image.open('image.gif')
im_matrix = np.array(im)
print(im_matrix[0][0])

(0,0) 위치에 픽셀의 RGB 벡터 제공


답변