Bonsoir,
Tu donnes une dimension supplémentaire à ton tableau qui représente l'image finale:
arr = numpy.zeros((h, w, 1), numpy.float)
Alors que les tableaux de la boucle sont en 2d:
imarr = numpy.array(Image.open(im), dtype=numpy.float)
D'où l'erreur de concaténation.
Ceci a fonctionné pour moi:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| import os, numpy, PIL
from PIL import Image
os.chdir("/home/..." ) #ton chemin
dir_files = os.listdir(os.getcwd())
tiff_files = [filename for filename in dir_files if filename[-5:] == ".tiff"]
width, height = Image.open(tiff_files[0]).size
image_amount = len(tiff_files)
average = numpy.zeros((height, width), dtype=numpy.float)
for file in tiff_files:
image = numpy.array(Image.open(file), dtype=numpy.float)
average += image / image_amount
average = numpy.array(numpy.round(average), dtype=numpy.uint8)
out = Image.fromarray(average)
out.save("Average.tiff")
out.show() |
Il est aussi possible d'utiliser la fonction mean() de numpy. C'est certes plus compact mais au bout d'un seuil le temps d'exécution n'est plus compétitif face à la boucle (car on effectue des opérations sur des tableaux volumineux qui prennent beaucoup de mémoire):
1 2 3 4 5 6 7 8 9 10 11 12
| import os, numpy, scipy
import matplotlib.pyplot as plt
os.chdir("/home/..." ) #ton chemin
dir_files = os.listdir(os.getcwd())
tiff_files = [filename for filename in dir_files if filename[-5:] == ".tiff"]
images = numpy.array([numpy.array(scipy.misc.imread(file), dtype=numpy.float) for file in tiff_files])
average = numpy.array(numpy.round(numpy.mean(images, axis=0)), dtype=numpy.uint8)
plt.imshow(average, cmap=plt.cm.gray)
plt.show() |
Partager