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


93

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

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

그러나 3 개의 숫자 (예 : R, G, B)가 아닌 숫자 (예 : 0또는 1) 만 출력합니다 60,60,60. 기능에 대해 이해하지 못하는 것 같습니다. 나는 약간의 설명을 좋아한다.

감사합니다.

답변:


147

예, 이렇게 :

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이미지에 대해 잘 작동 합니다.


1
이미지 파일뿐만 아니라 컴퓨터 화면에서도이 작업을 수행 할 수 있습니까?
Musixauce3000

1
Image.getpixel ()은 0 기반입니까 아니면 1 기반입니까? 내 말은, 가장 왼쪽 위의 픽셀은 (0,0)입니까 아니면 (1, 1)입니까?

2
@NimaBavari 0부터 시작합니다.
Nolan

3

GIF는 색상을 팔레트에 가능한 x 개의 색상 중 하나로 저장합니다. gif 제한 색상 팔레트 에 대해 읽어보십시오 . 따라서 PIL은 해당 팔레트 색상의 색상 정보가 아닌 팔레트 색인을 제공합니다.

편집 : 오타가있는 블로그 게시물 솔루션에 대한 링크를 제거했습니다. 다른 답변은 오타없이 동일한 작업을 수행합니다.


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)

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.imread한다 1.0.0 SciPy에서 사용되지 않는 (감사 알림에 대한 fbahr !)


PSA : scipy.misc.imread더 이상 사용되지 않습니다! imreadSciPy 1.0.0에서 더 이상 사용되지 않으며 1.2.0에서 제거됩니다. imageio.imread대신 사용하십시오 .
fbahr

1
알림 감사합니다, fbahr! (실제로 deprecating에 참여했습니다 -github.com/scipy/scipy/issues/6242 🙈)
Martin Thoma

0

numpy 사용 :

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.