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 !)
scipy.misc.imread
더 이상 사용되지 않습니다! imread
SciPy 1.0.0에서 더 이상 사용되지 않으며 1.2.0에서 제거됩니다. imageio.imread
대신 사용하십시오 .
numpy 사용 :
im = Image.open('image.gif')
im_matrix = np.array(im)
print(im_matrix[0][0])
(0,0) 위치에 픽셀의 RGB 벡터 제공