Add photo_stitcher/src/photo_stitcher/core.py

This commit is contained in:
Mika 2026-03-15 03:07:38 +00:00
parent 5224bdb7a7
commit 7d87c67008

View file

@ -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