Tôi đang sử dụng Python Imaging Library để tô màu hình ảnh đen trắng với bảng tra cứu xác định mối quan hệ màu. Bảng tra cứu đơn giản là một danh sách 256 phần tử của các bộ RGB:Sử dụng phương pháp Image.point() trong PIL để thao tác dữ liệu pixel
>>> len(colors)
256
>>> colors[0]
(255, 237, 237)
>>> colors[127]
(50, 196, 33)
>>>
phiên bản đầu tiên của tôi sử dụng các phương pháp getpixel()
và putpixel()
:
for x in range(w):
for y in range(h):
pix = img.getpixel((x,y))
img.putpixel((x,y), colors[pix[0]])
Đây là khủng khiếp chậm. Báo cáo profile
chỉ đến các phương pháp putpixel
và getpixel
là thủ phạm. Một điều tra nhỏ (ví dụ, đọc tài liệu) và tôi tìm thấy "Lưu ý rằng phương pháp này tương đối chậm." re: putpixel
. (thực tế thời gian chạy: 53s trong putpixel
và 50 getpixel
cho một hình ảnh 1024x1024)
Dựa vào gợi ý trong các tài liệu, tôi đã sử dụng im.load()
và truy cập pixel trực tiếp thay vì:
pixels = img.load()
for x in range(w):
for y in range(h):
pix = pixels[x, y]
pixels[x, y] = colors[pix[0]]
chế biến tăng tốc bởi một thứ tự độ lớn, nhưng vẫn còn chậm: khoảng 3,5 để xử lý hình ảnh 1024x1024.
Một nghiên cứu thấu đáo hơn về các tài liệu PIL dường như chỉ ra Image.point()
là chính xác dành cho mục đích này:
im.point(table)
=> hình ảnh
im.point(function)
=> hình ảnhTrả về một bản sao của hình ảnh nơi mỗi pixel được ánh xạ qua bảng đã cho. Bảng phải chứa 256 giá trị cho mỗi băng trong hình ảnh. Nếu một hàm được sử dụng thay vào đó, nó sẽ lấy một đối số duy nhất. Hàm này được gọi một lần cho mỗi giá trị pixel có thể và bảng kết quả được áp dụng cho tất cả các dải của hình ảnh.
Tôi đã dành một chút thời gian hack xung quanh với giao diện, nhưng dường như không thể làm đúng. Hãy tha thứ cho sự thiếu hiểu biết của tôi, nhưng tài liệu của PIL là curt và tôi không có nhiều kinh nghiệm xử lý hình ảnh. Tôi đã googled xung quanh một chút và bật lên một vài ví dụ, nhưng không có gì mà làm cho việc sử dụng "click" cho tôi. Do đó, cuối cùng, câu hỏi của tôi:
- Là
Image.point()
công cụ phù hợp cho công việc này? - Định dạng/cấu trúc nào
Image.point()
mong đợi bảng? - Ai đó có thể thực hiện một ví dụ không? Mỗi lần lặp lại tôi đã cố gắng cho đến nay đã kết thúc với một hình ảnh đen thẳng.
flatten danh sách? ok, nhưng nó hoạt động như thế nào? Tôi muốn các pixel có giá trị 0 -> (12, 140, 10) và pixel có giá trị 255 -> (254, 237, 220). –
bạn biết đấy, tôi nghĩ đây có thể là Địa điểm duy nhất trên Internet nơi định dạng được mong đợi của bảng đó được mô tả. // Tôi chỉ có img.point() làm việc với bảng tra cứu, nhờ vào mô tả của bạn. Kết quả không chính xác như những gì tôi mong đợi, nhưng tôi đã có đủ để hack xung quanh và tìm ra. Cám ơn rất nhiều! –
@ J.J., Định dạng này không thực sự rõ ràng. Tôi đã làm sai trong lời giải thích đầu tiên của mình và tôi đã sửa nó ngay bây giờ. Tôi hy vọng tôi đã nhận nó đúng thời gian này. Tôi sẽ ngủ vì vậy tôi sẽ không thể trả lời câu hỏi. –