รับ RGB ของพิกเซลโดยใช้ PIL


94

เป็นไปได้ไหมที่จะได้สี RGB ของพิกเซลโดยใช้ PIL? ฉันใช้รหัสนี้:

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

อย่างไรก็ตามมันจะแสดงเฉพาะตัวเลข (เช่น0หรือ1) ไม่ใช่สามตัวเลข (เช่น60,60,60สำหรับ R, G, B) ฉันเดาว่าฉันไม่เข้าใจบางอย่างเกี่ยวกับฟังก์ชันนี้ ฉันชอบคำอธิบายบางอย่าง

ขอบคุณมาก.

คำตอบ:


149

ใช่วิธีนี้:

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 อ้างถึงค่าใดค่าหนึ่งใน 256 ค่าในจานสี GIF

ดูเพิ่มเติมที่โพสต์ SO นี้: ค่าพิกเซล Python และ PIL แตกต่างกันสำหรับ GIF และ JPEGและหน้าอ้างอิง PIL นี้ มีข้อมูลเพิ่มเติมเกี่ยวกับconvert()ฟังก์ชัน

อย่างไรก็ตามรหัสของคุณจะทำงานได้ดีสำหรับ.jpgรูปภาพ


1
สามารถทำได้บนหน้าจอคอมพิวเตอร์ไม่ใช่แค่ไฟล์รูปภาพ?
Musixauce3000

1
Image.getpixel () เป็น 0-based หรือ 1-based? ฉันหมายถึงพิกเซลบนซ้ายสุดคือ (0,0) หรือคือ (1, 1)?

2
@NimaBavari เป็น 0-based
Nolan

3

GIFs เก็บสีเป็นหนึ่งใน 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จะเลิกใช้ใน SciPy 1.0.0 (ขอบคุณสำหรับการแจ้งเตือนให้fbahr !)


PSA: scipy.misc.imreadเลิกใช้แล้ว! imreadเลิกใช้แล้วใน SciPy 1.0.0 และจะถูกลบออกใน 1.2.0 ใช้imageio.imreadแทน
fbahr

1
ขอบคุณสำหรับการแจ้งเตือน fbahr! (จริงๆแล้วฉันมีส่วนร่วมในการเลิกใช้ - 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])

ให้เวกเตอร์ RGB ของพิกเซลในตำแหน่ง (0,0)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.