PIL kullanarak pikselin RGB'sini alın


94

PIL kullanarak bir pikselin RGB rengini elde etmek mümkün müdür? Bu kodu kullanıyorum:

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

Ancak, yalnızca bir sayı verir (ör. 0 Veya 1) ve üç sayı çıkarmaz (ör 60,60,60. R, G, B için). Sanırım işlev hakkında bir şey anlamıyorum. Biraz açıklama yapmak isterim.

Çok teşekkürler.

Yanıtlar:


149

Evet, bu şekilde:

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)

Daha önce ile tek bir değer almanızın nedeni pix[1, 1], GIF piksellerinin GIF renk paletindeki 256 değerden birine başvurmasıdır.

Ayrıca şu SO gönderisine bakın: GIF ve JPEG için farklı Python ve PIL piksel değerleri ve bu PIL Referans sayfasıconvert() işlev hakkında daha fazla bilgi içerir .

Bu arada, kodunuz .jpgresimler için gayet iyi çalışır .


1
Bu sadece bir görüntü dosyası için değil de bilgisayar ekranı için yapılabilir mi?
Musixauce3000

1
Image.getpixel () 0 tabanlı mı yoksa 1 tabanlı mı? Demek istediğim, en üstteki piksel (0,0) mı yoksa (1, 1) mi?

2
@NimaBavari 0 tabanlıdır.
Nolan

3

GIF'ler, renkleri bir paletteki olası x sayıdaki renkten biri olarak depolar. Gif sınırlı renk paleti hakkında bilgi edinin . Yani PIL size o palet renginin renk bilgisi yerine palet indeksini veriyor.

Düzenle: Yazım hatası olan bir blog gönderisi çözümünün bağlantısı kaldırıldı. Diğer cevaplar da aynı şeyi yazım hatası olmadan yapar.


2

Görüntüyü dönüştürmenin bir alternatifi, paletten bir RGB indeksi oluşturmaktır.

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 değil, ancak imageio.imreadyine de ilginç olabilir:

import imageio
im = scipy.misc.imread('um_000000.png', flatten=False, mode='RGB')
im = imageio.imread('Figure_1.png', pilmode='RGB')
print(im.shape)

verir

(480, 640, 3)

yani (yükseklik, genişlik, kanallar). Konumundaki piksel Yani (x, y)olduğunu

color = tuple(im[y][x])
r, g, b = color

Modası geçmiş

scipy.misc.imreadolduğu 1.0.0 SciPy kullanımdan kaldırılmış (teşekkürler hatırlatma için fbahr !)


PSA: scipy.misc.imreadkullanımdan kaldırıldı! imreadSciPy 1.0.0'da kullanımdan kaldırılmıştır ve 1.2.0'da kaldırılacaktır. imageio.imreadBunun yerine kullanın .
fbahr

1
Hatırlatma için teşekkürler fbahr! (Aslında onu kullanımdan kaldırmaya dahil oldum - github.com/scipy/scipy/issues/6242 🙈)
Martin Thoma

0

Numpy ile:

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

Pikselin RGB vektörünü (0,0) konumunda verin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.