Hướng dẫn how do you average an image in python? - làm thế nào để bạn tính trung bình một hình ảnh trong python?

Tôi cảm thấy khó khăn khi tưởng tượng một tình huống trong đó bộ nhớ là một vấn đề ở đây, nhưng trong sự kiện (không thể) mà bạn hoàn toàn không đủ khả năng để tạo ra mảng phao cần thiết cho câu trả lời ban đầu của tôi, bạn có thể sử dụng chức năng pha trộn của PIL, như được đề xuất bởi @ Mhurley như sau:

# Alternative method using PIL blend function
avg=Image.open(imlist[0])
for i in xrange(1,N):
    img=Image.open(imlist[i])
    avg=Image.blend(avg,img,1.0/float(i+1))
avg.save("Blend.png")
avg.show()

Bạn có thể lấy đúng trình tự của các giá trị alpha, bắt đầu bằng định nghĩa từ hàm pha trộn của PIL:

out = image1 * (1.0 - alpha) + image2 * alpha

Hãy suy nghĩ về việc áp dụng hàm đó đệ quy vào một vectơ số (chứ không phải hình ảnh) để có được giá trị trung bình của vectơ. Đối với một vectơ có độ dài n, bạn sẽ cần các hoạt động pha trộn N-1, với các giá trị n-1 khác nhau của alpha.

Tuy nhiên, có lẽ dễ suy nghĩ trực quan hơn về các hoạt động. Ở mỗi bước, bạn muốn hình ảnh AVG chứa tỷ lệ bằng nhau của hình ảnh nguồn từ các bước trước đó. Khi pha trộn các hình ảnh nguồn thứ nhất và thứ hai, alpha phải là 1/2 để đảm bảo tỷ lệ bằng nhau. Khi pha trộn thứ ba với mức trung bình của hai cái đầu tiên, bạn muốn hình ảnh mới được tạo thành từ 1/3 của hình ảnh thứ ba, phần còn lại được tạo thành trung bình của các hình ảnh trước đó (giá trị hiện tại của AVG) , và như thế.

Về nguyên tắc, câu trả lời mới này, dựa trên sự pha trộn, sẽ ổn. Tuy nhiên tôi không biết chính xác chức năng pha trộn hoạt động như thế nào. Điều này khiến tôi lo lắng về cách các giá trị pixel được làm tròn sau mỗi lần lặp.

Hình ảnh dưới đây được tạo từ 288 hình ảnh nguồn bằng cách sử dụng mã từ câu trả lời ban đầu của tôi:

Hướng dẫn how do you average an image in python? - làm thế nào để bạn tính trung bình một hình ảnh trong python?

Mặt khác, hình ảnh này được tạo ra bằng cách áp dụng nhiều lần chức năng pha trộn của PIL cho cùng 288 hình ảnh:

Hướng dẫn how do you average an image in python? - làm thế nào để bạn tính trung bình một hình ảnh trong python?

Tôi hy vọng bạn có thể thấy rằng các đầu ra từ hai thuật toán khác nhau đáng kể. Tôi mong đợi điều này là do tích lũy các lỗi làm tròn nhỏ trong quá trình áp dụng hình ảnh lặp đi lặp lại.

Tôi thực sự đề xuất câu trả lời ban đầu của tôi về sự thay thế này.

Hướng dẫn how do you average an image in python? - làm thế nào để bạn tính trung bình một hình ảnh trong python?

Trang này cho thấy cách tạo hình ảnh trung bình của các mảng hình ảnh bằng mô -đun Python và PIL (Thư viện hình ảnh Python). Thật dễ dàng để làm bằng cách chuyển đổi hình ảnh thành numpy.array.
It is easy to do by converting the image to the numpy.array.

Trong & nbsp; [1]:

%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
from PIL import Image

Tạo hình ảnh gốc

Trong & nbsp; [2]:

for i in range(1, 21):
    col = int(255 * i / 20)
    img = Image.new('RGB', (120, 80), color=(col, col, col))
    img.save('%02d.bmp' % i, format='bmp')

Tải các hình ảnh gốc được lưu ngay trên

In & nbsp; [3]:

ims = []
for i in range(1, 21):
    ims.append(Image.open('%02d.bmp' % i, mode='r'))

Kiểm tra hình ảnh gốc

Chuyển đổi hình ảnh được tải thành Nandarray Numpy

Trong & nbsp; [7]:

ims = np.array([np.array(im) for im in ims])

Kiểm tra hình dạng của mảng IMS

Tạo mảng trung bình

Trong & nbsp; [9]:

imave = np.average(ims,axis=0)

Kiểm tra hình dạng của mảng IMS

Tạo mảng trung bình

Trong & nbsp; [9]:

result = Image.fromarray(imave.astype('uint8'))

Chuyển đổi hình ảnh trung bình (trong float) thành hình ảnh PIL (UINT8)

Trong & nbsp; [11]:

result.save('result.bmp')