Comment traiter les fichiers dans un dossier#
Dans ce notebook, nous allons programmer une boucle qui parcourt un dossier d’images. De plus, la boucle appellera une fonction Python qui analyse les images une par une. Ainsi, nous traiterons toutes les images de ce dossier en utilisant la même procédure.
Voir aussi
import os
from skimage.io import imread
from matplotlib.pyplot import imshow, show
from skimage.io import imread
import numpy as np
À des fins de démonstration, nous réutilisons un dossier d’images montrant des tranches de banane imagées par résonance magnétique (avec l’aimable autorisation de Nasreddin Abolmaali, OncoRay, TU Dreesden)
# define the location of the folder to go through
directory = '../../data/banana/'
# get a list of files in that folder
file_list = os.listdir(directory)
file_list
['banana0002.tif',
'banana0003.tif',
'banana0004.tif',
'banana0005.tif',
'banana0006.tif',
'banana0007.tif',
'banana0008.tif',
'banana0009.tif',
'banana0010.tif',
'banana0011.tif',
'banana0012.tif',
'banana0013.tif',
'banana0014.tif',
'banana0015.tif',
'banana0016.tif',
'banana0017.tif',
'banana0018.tif',
'banana0019.tif',
'banana0020.tif',
'banana0021.tif',
'banana0022.tif',
'banana0023.tif',
'banana0024.tif',
'banana0025.tif',
'banana0026.tif',
'image_source.txt']
Évidemment, il n’y a pas que des images dans ce dossier. Nous pouvons filtrer cette liste avec une courte instruction for :
image_file_list = [file for file in file_list if file.endswith(".tif")]
image_file_list
['banana0002.tif',
'banana0003.tif',
'banana0004.tif',
'banana0005.tif',
'banana0006.tif',
'banana0007.tif',
'banana0008.tif',
'banana0009.tif',
'banana0010.tif',
'banana0011.tif',
'banana0012.tif',
'banana0013.tif',
'banana0014.tif',
'banana0015.tif',
'banana0016.tif',
'banana0017.tif',
'banana0018.tif',
'banana0019.tif',
'banana0020.tif',
'banana0021.tif',
'banana0022.tif',
'banana0023.tif',
'banana0024.tif',
'banana0025.tif',
'banana0026.tif']
Alternativement, nous pouvons également écrire une boucle for plus longue et vérifier si les fichiers sont des images. Ce code fait exactement la même chose, il est juste écrit d’une manière différente.
# go through all files in the folder
for file in file_list:
# if the filename is of a tif-image, print it out
if file.endswith(".tif"):
print(file)
banana0002.tif
banana0003.tif
banana0004.tif
banana0005.tif
banana0006.tif
banana0007.tif
banana0008.tif
banana0009.tif
banana0010.tif
banana0011.tif
banana0012.tif
banana0013.tif
banana0014.tif
banana0015.tif
banana0016.tif
banana0017.tif
banana0018.tif
banana0019.tif
banana0020.tif
banana0021.tif
banana0022.tif
banana0023.tif
banana0024.tif
banana0025.tif
banana0026.tif
Comme vous pouvez le voir ci-dessus, image_file_list est une liste de chaînes de caractères. Stocker le nom de l’image dans une liste nécessite beaucoup moins de puissance de calcul que de stocker les images elles-mêmes dans la liste. Il est logique d’utiliser imread pour lire les images au dernier moment possible, ici dans la boucle for ci-dessous. Si vous êtes intéressé par les structures de dossiers et la spécification de ces répertoires, vous pouvez consulter ces deux notebooks Jupyter ici et ici.
Pour afficher toutes les images, nous devons les ouvrir à partir du bon directory :
# go through all files in the folder
for image_file in image_file_list:
image = imread(directory + image_file)
imshow(image)
show()
Les fonctions personnalisées nous aident à garder le code organisé. Par exemple, nous pouvons mettre le code d’analyse d’image dans une fonction et ensuite simplement l’appeler :
def load_and_measure(filename):
"""
This function opens an image and returns its mean intensity.
"""
image = imread(filename)
# return mean intensity in the image
return np.mean(image)
# for testing
load_and_measure(directory + "banana0010.tif")
69.15106201171875
Avec une telle fonction personnalisée, nous pouvons également utiliser la forme courte pour écrire des boucles for :
mean_intensities_of_all_images = [load_and_measure(directory + file) for file in image_file_list]
mean_intensities_of_all_images
[12.94198947482639,
25.04678683810764,
39.627543131510414,
49.71319580078125,
56.322109646267364,
60.08679877387153,
63.94538031684028,
66.04618326822917,
69.15106201171875,
70.85603162977431,
74.40909152560764,
77.48423936631944,
81.77360026041667,
85.44072129991319,
91.22532823350694,
94.36199951171875,
98.47229682074652,
99.3980712890625,
102.34300401475694,
101.50947401258681,
97.14067247178819,
80.13118489583333,
49.77497694227431,
28.36090766059028,
18.806070963541668]
Exercice#
Ouvrez toutes les images du jeu de données de bananes, segmentez les images et mesurez le centroïde des tranches de banane dans un tableau. Écrivez les résultats des mesures dans “banana.csv”.
Astuce : Au lieu de la commande imshow dans le dernier exemple, exécutez votre flux de travail de traitement d’image. Configurez d’abord le flux de travail de traitement d’image, par exemple dans une fonction personnalisée. Programmez l’itération sur les fichiers d’un dossier en dernier, après que le traitement d’image fonctionne.