Dapatkan RGB piksel menggunakan PIL

93

Apakah mungkin untuk mendapatkan warna RGB dari sebuah piksel menggunakan PIL? Saya menggunakan kode ini:

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

Namun, itu hanya mengeluarkan angka (misalnya 0atau 1) dan bukan tiga angka (misalnya 60,60,60untuk R, G, B). Saya kira saya tidak memahami sesuatu tentang fungsinya. Saya ingin penjelasan.

Terima kasih banyak.

GermainZ
sumber

Jawaban:

147

Ya, begini:

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)

Alasan Anda mendapatkan nilai tunggal sebelumnya pix[1, 1]adalah karena piksel GIF merujuk ke salah satu dari 256 nilai di palet warna GIF.

Lihat juga posting SO ini: Nilai piksel Python dan PIL berbeda untuk GIF dan JPEG dan halaman Referensi PIL ini berisi informasi lebih lanjut tentang convert()fungsinya.

Ngomong-ngomong, kode Anda akan berfungsi dengan baik untuk .jpggambar.

Levon
sumber
1
Bisakah ini dilakukan untuk layar komputer, dan bukan hanya file gambar?
Musixauce3000
1
Apakah Image.getpixel () berbasis 0 atau 1? Maksud saya, piksel paling kiri atas adalah (0,0) atau itu (1, 1)?
2
@NimaBavari Ini berbasis 0.
Nolan
3

GIF menyimpan warna sebagai salah satu dari x jumlah kemungkinan warna dalam palet. Baca tentang palet warna terbatas gif . Jadi PIL memberi Anda indeks palet, bukan informasi warna dari warna palet itu.

Edit: Tautan yang dihapus ke solusi posting blog yang salah ketik. Jawaban lain melakukan hal yang sama tanpa salah ketik.

KobeJohn
sumber
2

Alternatif untuk mengonversi gambar adalah dengan membuat indeks RGB dari palet.

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)
Marcel Wilson
sumber
2

Bukan PIL, tapi imageio.imreadmungkin masih menarik:

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

memberi

(480, 640, 3)

jadi (tinggi, lebar, saluran). Jadi pixel pada posisi (x, y)ini

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

Usang

scipy.misc.imreadtidak digunakan lagi di SciPy 1.0.0 (terima kasih atas pengingatnya, fbahr !)

Martin Thoma
sumber
PSA: scipy.misc.imreadtidak digunakan lagi! imreadtidak digunakan lagi di SciPy 1.0.0, dan akan dihapus di 1.2.0. Gunakan imageio.imreadsebagai gantinya.
fbahr
1
Terima kasih atas pengingatnya, fbahr! (Saya sebenarnya terlibat dalam mencela itu - github.com/scipy/scipy/issues/6242 🙈)
Martin Thoma
0

Dengan numpy:

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

Berikan vektor RGB dari piksel pada posisi (0,0)

Raphaël Gervillié
sumber