Czy za pomocą PIL można uzyskać kolor RGB piksela? Używam tego kodu:
im = Image.open("image.gif")
pix = im.load()
print(pix[1,1])
Jednak wyłącznie wyjście liczbę (np 0
lub1
), a nie trzy liczby (np. 60,60,60
Dla R, G, B). Chyba nie rozumiem czegoś o tej funkcji. Chciałbym trochę wyjaśnienia.
Wielkie dzięki.
GIF-y przechowują kolory jako jeden z x możliwych kolorów w palecie. Przeczytaj o ograniczonej palecie kolorów gif . Tak więc PIL podaje indeks palety, a nie informacje o kolorze tej palety.
Edycja: Usunięto link do rozwiązania dotyczącego postów na blogu, które zawierało literówkę. Inne odpowiedzi robią to samo bez literówki.
źródło
Alternatywą dla konwersji obrazu jest utworzenie indeksu RGB z palety.
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)
źródło
Nie PIL, ale
imageio.imread
może być interesujący:import imageio im = scipy.misc.imread('um_000000.png', flatten=False, mode='RGB') im = imageio.imread('Figure_1.png', pilmode='RGB') print(im.shape)
daje
(480, 640, 3)
tak jest (wysokość, szerokość, kanały). Więc piksel na pozycji
(x, y)
toPrzestarzały
scipy.misc.imread
jest przestarzały w SciPy 1.0.0 (dzięki za przypomnienie, fbahr !)źródło
scipy.misc.imread
jest przestarzałe!imread
jest przestarzałe w SciPy 1.0.0 i zostanie usunięte w 1.2.0. Użyjimageio.imread
zamiast tego.Z numpy:
im = Image.open('image.gif') im_matrix = np.array(im) print(im_matrix[0][0])
Podaj wektor RGB piksela w pozycji (0,0)
źródło