diff --git a/photo_stitcher/src/photo_stitcher/core.py b/photo_stitcher/src/photo_stitcher/core.py new file mode 100644 index 0000000..12696f8 --- /dev/null +++ b/photo_stitcher/src/photo_stitcher/core.py @@ -0,0 +1,66 @@ +from pathlib import Path +from typing import List +from PIL import Image +import os + + +def combine_images(image_list: List[str], output_file: str) -> None: + """Kombiniert mehrere Bilder zu einem Gesamtbild auf Basis des Pixel-Mittelwerts. + + Args: + image_list (List[str]): Liste von Pfaden zu den Eingabebildern. + output_file (str): Pfad der Ausgabedatei, in der das kombinierte Bild gespeichert wird. + + Raises: + ValueError: Wenn image_list leer ist oder eine Datei nicht existiert. + OSError: Falls ein Bild nicht geöffnet werden kann. + """ + + # Eingabevalidierung + if not image_list: + raise ValueError("Die Bildliste darf nicht leer sein.") + + resolved_paths = [] + for path_str in image_list: + p = Path(path_str) + if not p.exists(): + raise ValueError(f"Eingabedatei nicht gefunden: {path_str}") + resolved_paths.append(p) + + # Bilder laden + images = [] + for p in resolved_paths: + try: + img = Image.open(p).convert("RGB") + images.append(img) + except Exception as e: + raise OSError(f"Fehler beim Öffnen der Datei {p}: {e}") + + # Bildergrößen aneinander anpassen (alle auf kleinste Größe) + min_width = min(img.width for img in images) + min_height = min(img.height for img in images) + + resized = [img.resize((min_width, min_height)) for img in images] + + # Pixelweise Mittelwert berechnen + import numpy as np + + np_arrays = [np.array(img, dtype=float) for img in resized] + mean_array = sum(np_arrays) / len(np_arrays) + mean_array = np.clip(mean_array, 0, 255).astype('uint8') + + result = Image.fromarray(mean_array, mode='RGB') + + output_path = Path(output_file) + output_path.parent.mkdir(parents=True, exist_ok=True) + + try: + result.save(output_path) + except Exception as e: + raise OSError(f"Fehler beim Speichern von {output_path}: {e}") + + # Speicher freigeben + for img in images: + img.close() + + return None \ No newline at end of file