Générateur d'images composites pour créer des datasets synthétiques d'images de microscopie, combinant cellules, masques de MEA (microelectrode arrays), oculaires et fonds personnalisés.
- Multi-cellules par image : chaque image contient plusieurs cellules piochées aléatoirement et placées sur un canvas
- Composition multi-couches : fond + cellules + MEA + oculaire
- Probabilités configurables pour chaque couche (un seul pass, plusieurs styles)
- Filtres naturels via OpenCV + Pillow : bruit gaussien, vignettage, flou, brightness, contraste
- Transformations géométriques indépendantes par cellule : rotation, scale, flip
- Masque de segmentation final cohérent avec les cellules placées
- Génération reproductible avec un seed
pip install pillow opencv-python numpyPuis copier le dossier mea_composer/ dans ton projet.
ton_projet/
├── mea_composer/ # La librairie
├── layers/
│ ├── cells/ # Sprites de cellules individuelles + leurs masques
│ │ # Ex: cell_01.png + cell_01_mask.png
│ ├── mockups/ # Images de MEA (fond transparent)
│ └── backgrounds/ # Fonds personnalisés (optionnel)
└── output/ # Résultats générés
Important : chaque cellule individuelle X.png doit avoir son masque X_mask.png dans le même dossier. Le composer pioche N cellules aléatoires par image, les transforme indépendamment, et les place sur le canvas.
from mea_composer import Composer
Composer().run()Par défaut : 50 images de 512×512, avec 3 à 10 cellules par image, 50% de chance de MEA, 50% d'oculaire.
from mea_composer import Composer, ComposerConfig
config = ComposerConfig(
total_images=200,
canvas_size=(1024, 1024),
cells_per_image_range=(10, 30), # Beaucoup de cellules par image
mea_probability=0.7,
eyepiece_probability=0.3,
seed=42,
)
Composer(config).run()Dataset varié
ComposerConfig(
total_images=500,
cells_per_image_range=(5, 20),
mea_probability=0.5,
eyepiece_probability=0.5,
)Cellules denses, sans MEA
ComposerConfig(
total_images=100,
cells_per_image_range=(20, 40),
mea_probability=0.0,
eyepiece_probability=1.0,
)Rendu propre sans filtres
ComposerConfig(
total_images=50,
enable_blur=False,
enable_noise=False,
enable_brightness=False,
enable_contrast=False,
enable_vignette=False,
)| Paramètre | Défaut | Description |
|---|---|---|
total_images |
50 |
Nombre total d'images à générer |
canvas_size |
(512, 512) |
Taille du canvas de composition |
output_size |
None |
Resize final. None = garde canvas_size |
| Paramètre | Défaut | Description |
|---|---|---|
cells_per_image_range |
(3, 10) |
Nombre de cellules par image (min, max) |
cell_scale_range |
(0.5, 1.0) |
Échelle appliquée à chaque cellule |
cell_random_flip |
True |
Flip horizontal/vertical aléatoire par cellule |
cell_random_rotation |
True |
Rotation aléatoire par cellule |
cell_rotation_range |
(0, 360) |
Plage de rotation en degrés |
cell_edge_erosion |
True |
Érosion des bords de chaque cellule (grignote le détourage) |
cell_edge_erosion_sizes |
(3, 5) |
Tailles de noyau pour l'érosion |
cell_edge_blur |
True |
Flou gaussien des bords pour adoucir le détourage |
cell_edge_blur_range |
(1.0, 2.5) |
Rayon du flou des bords |
cell_opacity_range |
(0.85, 1.0) |
Opacité globale aléatoire par cellule (intégration au fond) |
max_cell_overlap |
1.0 |
Chevauchement max autorisé entre cellules (0 = disjointes, 0.3 = léger chevauchement, 1.0 = libre) |
placement_max_attempts |
30 |
Nb max de tentatives de placement par cellule (utile quand l'overlap est faible et l'espace se sature) |
Note : les filtres de bords (érosion, blur, opacité) s'appliquent à l'alpha de composition uniquement. Le masque de segmentation (ground truth) reste net.
Note 2 : si un oculaire est utilisé, toutes les cellules sont automatiquement contraintes à l'intérieur du disque. Pas besoin de réglage particulier.
| Paramètre | Défaut | Description |
|---|---|---|
mea_probability |
0.5 |
Probabilité d'ajouter une MEA |
eyepiece_probability |
0.5 |
Probabilité d'ajouter un oculaire |
background_probability |
1.0 |
Probabilité d'utiliser un fond custom |
| Paramètre | Défaut | Description |
|---|---|---|
enable_blur |
True |
Flou gaussien global |
blur_radius_range |
(0.0, 0.8) |
Rayon du flou |
enable_noise |
True |
Bruit gaussien (OpenCV) |
noise_intensity_range |
(0.005, 0.02) |
Intensité du bruit |
enable_brightness |
True |
Variation de luminosité |
brightness_range |
(0.9, 1.1) |
Facteur multiplicatif |
enable_contrast |
True |
Variation de contraste |
contrast_range |
(0.9, 1.1) |
Facteur multiplicatif |
enable_vignette |
True |
Vignettage radial |
vignette_strength_range |
(0.1, 0.3) |
Intensité du vignettage |
Pour des filtres plus marqués, élargir simplement les ranges (ex: noise_intensity_range=(0.02, 0.08)).
| Paramètre | Défaut | Description |
|---|---|---|
mea_edge_blur |
True |
Flou des bords de la MEA |
mea_edge_blur_range |
(2.0, 5.0) |
Rayon du flou |
mea_erosion |
True |
Érosion des bords |
mea_erosion_sizes |
(3, 5) |
Tailles de noyau possibles |
| Paramètre | Défaut | Description |
|---|---|---|
eyepiece_radius_ratio_range |
(0.4, 0.9) |
Taille relative du cercle |
eyepiece_edge_blur |
True |
Flou des bords |
eyepiece_edge_blur_range |
(5.0, 13.0) |
Rayon du flou |
Convertit les cellules ou le fond en grayscale puis remappe sur un gradient entre deux couleurs. Utile pour standardiser un dataset avec des cellules aux couleurs hétérogènes.
| Paramètre | Défaut | Description |
|---|---|---|
enable_cell_recolor |
False |
Active le remapping couleur des cellules |
cell_color_dark |
(30, 20, 15) |
Couleur RGB pour les pixels sombres des cellules |
cell_color_light |
(240, 220, 190) |
Couleur RGB pour les pixels clairs des cellules |
enable_background_recolor |
False |
Active le remapping couleur du fond |
background_color_dark |
(60, 55, 50) |
Couleur sombre du fond |
background_color_light |
(220, 210, 200) |
Couleur claire du fond |
La structure interne est préservée (les détails sombres restent sombres, les clairs restent clairs). Exemple : cell_color_dark=(80, 20, 60) + cell_color_light=(255, 200, 230) donne des cellules en tons rosés.
Ajoute des distracteurs (petits points/taches) sur le fond. Ils n'apparaissent pas dans le masque de segmentation, donc utilisables comme négatifs pour entraîner un modèle à ignorer le bruit.
| Paramètre | Défaut | Description |
|---|---|---|
enable_artifacts |
False |
Active l'ajout d'artefacts |
artifacts_count_range |
(10, 30) |
Nombre d'artefacts par image |
artifacts_size_range |
(1, 5) |
Rayon de chaque artefact en pixels |
artifacts_opacity_range |
(0.2, 0.7) |
Opacité des artefacts |
artifacts_type |
"mixed" |
Type : "dot" (point rond), "speck" (tache), "mixed" (les deux) |
artifacts_color |
(40, 30, 25) |
Couleur RGB des artefacts |
| Paramètre | Défaut | Description |
|---|---|---|
cells_dir |
./layers/cells/ |
Dossier des sprites de cellules |
mea_dir |
./layers/mockups/ |
Dossier des MEA |
backgrounds_dir |
./layers/backgrounds/ |
Dossier des fonds |
output_dir |
./output/ |
Dossier de sortie |
output_format |
"png" |
Format de sortie |
save_mask |
True |
Sauvegarde le masque de vérité |
filename_template |
"composite_{index:04d}" |
Template des noms |
mask_suffix |
"_mask" |
Suffixe pour les masques |
| Paramètre | Défaut | Description |
|---|---|---|
seed |
None |
Seed pour reproductibilité |
verbose |
True |
Affiche la progression |
progress_every |
10 |
Message tous les N images |
from mea_composer import Composer, ComposerConfigComposerConfig(**kwargs): dataclass avec tous les paramètresComposer(config=None): le générateur.run() -> int: lance la génération, retourne le nombre d'images produites
Pour chaque image du dataset :
- Fond : on pioche un fond aléatoire (ou couleur unie si pas de fond disponible)
- Cellules : on tire N entre
cells_per_image_range, puis N fois on pioche aléatoirement un sprite, on le transforme (scale, flip, rotation), et on le colle à une position aléatoire sur le canvas. Le masque global est la fusion des masques individuels. - MEA (probabilité
mea_probability) : on superpose une grille d'électrodes - Oculaire (probabilité
eyepiece_probability) : on ajoute un oculaire noir circulaire, et le masque final est croppé au cercle - Filtres : flou, bruit, brightness, contraste, vignettage
- Sauvegarde : image composite + masque de segmentation
Chaque image génère deux fichiers :
composite_XXXX.png: l'image composite finale (RGB)composite_XXXX_mask.png: le masque de segmentation (niveaux de gris, 255 = cellule)