Nhận RGB của pixel bằng PIL


93

Có thể lấy màu RGB của một pixel bằng PIL không? Tôi đang sử dụng mã này:

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

Tuy nhiên, nó chỉ xuất ra một số (ví dụ 0hoặc 1) chứ không phải ba số (ví dụ: 60,60,60cho R, G, B). Tôi đoán tôi không hiểu điều gì đó về chức năng. Tôi muốn một số lời giải thích.

Cảm ơn rất nhiều.

Câu trả lời:


147

Có, theo cách này:

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)

Lý do bạn nhận được một giá trị duy nhất trước đây pix[1, 1]là vì các pixel GIF tham chiếu đến một trong 256 giá trị trong bảng màu GIF.

Xem thêm bài đăng SO này: Giá trị pixel của Python và PIL khác nhau đối với GIF và JPEGtrang Tham chiếu PIL này chứa nhiều thông tin hơn về convert()hàm.

Nhân tiện, mã của bạn sẽ hoạt động tốt cho .jpghình ảnh.


1
Điều này có thể được thực hiện cho màn hình máy tính, và không chỉ là một tệp hình ảnh?
Musixauce3000

1
Image.getpixel () dựa trên 0 hay dựa trên 1? Ý tôi là, pixel phía trên bên trái là (0,0) hay là (1, 1)?

2
@NimaBavari Nó dựa trên 0.
Nolan

3

GIF lưu trữ màu dưới dạng một trong số x số màu có thể có trong bảng màu. Đọc về bảng màu giới hạn gif . Vì vậy, PIL cung cấp cho bạn chỉ số bảng màu, chứ không phải thông tin màu của màu bảng đó.

Chỉnh sửa: Đã xóa liên kết đến giải pháp bài đăng trên blog có lỗi đánh máy. Các câu trả lời khác làm điều tương tự mà không có lỗi đánh máy.


2

Một cách thay thế để chuyển đổi hình ảnh là tạo chỉ số RGB từ bảng màu.

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

Không phải PIL, nhưng imageio.imreadvẫn có thể thú vị:

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

cho

(480, 640, 3)

vì vậy nó là (chiều cao, chiều rộng, kênh). Vì vậy, pixel ở vị trí (x, y)

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

Lỗi thời

scipy.misc.imreadđược tán thành trong scipy 1.0.0 (cảm ơn cho lời nhắc nhở, fbahr !)


PSA: scipy.misc.imreadkhông được dùng nữa! imreadkhông được dùng trong SciPy 1.0.0 và sẽ bị xóa trong 1.2.0. Sử dụng imageio.imreadthay thế.
fbahr

1
Cảm ơn vì đã nhắc nhở, fbahr! (Tôi thực sự đã tham gia vào việc không dùng nó - github.com/scipy/scipy/issues/6242 🙈)
Martin Thoma

0

Với numpy:

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

Cho vectơ RGB của pixel ở vị trí (0,0)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.