2015-07-23 4 views
1

Я пытаюсь усреднить 300 .tif изображений с этим кодом:Усреднение несколько изображений в питоне

import os, numpy, PIL 
from PIL import Image 

# Access all PNG files in directory 
allfiles=os.listdir(os.getcwd()) 
imlist=[filename for filename in allfiles if filename[-4:] in[".tif",".TIF"]] 

# Assuming all images are the same size, get dimensions of first image 
w,h = Image.open(imlist[0]).size 
N = len(imlist) 

# Create a numpy array of floats to store the average (assume RGB images) 
arr = numpy.zeros((h,w,3),numpy.float) 

# Build up average pixel intensities, casting each image as an array of floats 
for im in imlist: 
    imarr = numpy.array(Image.open(im),dtype=numpy.float) 
    arr = arr+imarr/N 

# Round values in array and cast as 16-bit integer 
arr = numpy.array(numpy.round(arr),dtype=numpy.uint16) 

# Generate, save and preview final image 
out = Image.fromarray(arr,mode="RGB") 
out.save("Average.tif") 

И это дает мне TypeError подобному:

imarr = numpy.array(Image.open(im),dtype=numpy.float) 
TypeError: float() argument must be a string or a number, not 'TiffImageFile' 

Я понимаю, что это Безразлично Мне очень нравится помещать TIF-образ в массив numpy (он также не работает с изображениями PNG). Что мне делать ? Разделение каждого изображения на массивы R, G и B в среднем, а затем слияние все кажется слишком памяти.

+0

Ваша проблема в том, что вы передаете numpy в этой строке. Вы пытаетесь передать Image.open (im), который является типом TiffImageFile и не принимается float(). Я не работал с PIL, но я вижу в Интернете, что Image.load (im) может быть тем, что вы ищете. В противном случае попробуйте и посмотрите, может ли объект «im» иметь что-то вроде im.data или так далее. – Jblasco

+0

И я был бы очень удивлен, если бы «Библиотека изображений Python», кстати, не имела способа средние изображения. Может быть, вы просто пытаетесь научиться самому это делать? – Jblasco

+0

@Jblasco, PIL обеспечивает метод смешивания, который я использовал в другой программе усреднения. Я считаю, что код выше (как только он сработает) обеспечит лучший результат для большого количества изображений в среднем. Я буду исследовать ваши предложения, даже если этот код должен работать (см. Ответ ниже). –

ответ

1

Он должен работать как есть, проверен прямо сейчас с PIL (подушка 2.9.0) и numpy 1.9.2.

+0

Я обновил свой numpy с 1.8.2 до 1.9.2, но ничего не изменил. Мне действительно интересно, почему, поскольку мы запускаем ту же программу с теми же версиями PIL и numpy. –

+0

Я запустил ваш код внутри virtualenv с помощью только numpy и pillow, как для py2, так и для py3. – fernandezcuesta

Смежные вопросы