Update app.py
Browse files
app.py
CHANGED
|
@@ -414,39 +414,27 @@ def enhanced_composite_with_sam(original_image, inpaint_result, original_mask,
|
|
| 414 |
# Original BBox-Bereich ausgeschnitten werden und
|
| 415 |
mask_cropped = original_mask.crop(bbox_coords)
|
| 416 |
print(f"🔍 [MASK] Mask-Crop Size: {mask_cropped.size}")
|
| 417 |
-
|
| 418 |
-
#
|
|
|
|
|
|
|
| 419 |
soft_mask = mask_cropped.filter(ImageFilter.GaussianBlur(3))
|
| 420 |
|
| 421 |
-
# DEBUG: Prüfe welche Werte die Maske hat
|
| 422 |
-
# DEBUG: Prüfe soft_mask
|
| 423 |
print(f"🔍 Soft-Mask unique values PRE: {np.unique(np.array(soft_mask))[:20]}")
|
| 424 |
print(f"🔍 Soft-Mask Min/Max: {np.array(soft_mask).min()}, {np.array(soft_mask).max()}")
|
| 425 |
-
|
| 426 |
-
|
| 427 |
-
|
| 428 |
-
# Binarisieren für klare Alpha-Werte (nur 0 oder 255)
|
| 429 |
-
#threshold = 0
|
| 430 |
-
#alpha_mask = soft_mask.point(lambda x: 255 if x > threshold else 0)
|
| 431 |
-
#print(f"🔍 Alpha-Mask unique values: {np.unique(np.array(alpha_mask))}")
|
| 432 |
-
|
| 433 |
-
|
| 434 |
-
|
| 435 |
-
# Alpha-Compositing mit präziser SAM-Maske
|
| 436 |
-
# damit wird auf den neu generirten BBox-Bereich in Originalgröße eine Folie gezogen
|
| 437 |
-
#edited_rgba = edited_region_fullsize.convert("RGBA")
|
| 438 |
-
# Dadurch werden in die Folie der weichen SAM-Maske wieder an den Stellen schwarze/transparente Löcher
|
| 439 |
-
# gerissen wo der Hintergrund innerhalb der BBox bleiben muß! In den Löchern bleibt das Originalbild!
|
| 440 |
-
#mask_inverted = Image.eval(soft_mask, lambda x: 255 - x) #invertieren
|
| 441 |
|
| 442 |
alpha_mask = soft_mask
|
| 443 |
|
| 444 |
-
#
|
| 445 |
-
|
| 446 |
rgb_only = edited_region_fullsize.convert("RGB")
|
|
|
|
|
|
|
|
|
|
| 447 |
edited_rgba = rgb_only.convert("RGBA")
|
| 448 |
|
| 449 |
-
# Jetzt Alpha setzen
|
|
|
|
|
|
|
| 450 |
edited_rgba.putalpha(alpha_mask)
|
| 451 |
|
| 452 |
# DEBUG: Prüfe wirklich was drin ist
|
|
@@ -489,6 +477,7 @@ def enhanced_composite_with_sam(original_image, inpaint_result, original_mask,
|
|
| 489 |
return final_image.convert("RGB")
|
| 490 |
|
| 491 |
|
|
|
|
| 492 |
def auto_detect_face_area(image):
|
| 493 |
"""Optimierten Vorschlag für Gesichtsbereich ohne externe Bibliotheken"""
|
| 494 |
width, height = image.size
|
|
|
|
| 414 |
# Original BBox-Bereich ausgeschnitten werden und
|
| 415 |
mask_cropped = original_mask.crop(bbox_coords)
|
| 416 |
print(f"🔍 [MASK] Mask-Crop Size: {mask_cropped.size}")
|
| 417 |
+
|
| 418 |
+
# Die gesamte Maske wird weichgezeichnet für natürliche Alpha-Übergänge
|
| 419 |
+
# GaussianBlur erzeugt Graustufenwerte (0-255) statt binärer Maske (0 oder 255)
|
| 420 |
+
#soft_mask ist eine Maske mit Zahlen. 255-weiß, 0-schwarz
|
| 421 |
soft_mask = mask_cropped.filter(ImageFilter.GaussianBlur(3))
|
| 422 |
|
|
|
|
|
|
|
| 423 |
print(f"🔍 Soft-Mask unique values PRE: {np.unique(np.array(soft_mask))[:20]}")
|
| 424 |
print(f"🔍 Soft-Mask Min/Max: {np.array(soft_mask).min()}, {np.array(soft_mask).max()}")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 425 |
|
| 426 |
alpha_mask = soft_mask
|
| 427 |
|
| 428 |
+
# rgb_only ist das von Inpaint generierte reine Farbbild in Original-BBox-Größe
|
|
|
|
| 429 |
rgb_only = edited_region_fullsize.convert("RGB")
|
| 430 |
+
|
| 431 |
+
# Mit dieser Konvertierung bekommt jeder Pixel die Möglichkeit transparent zu werden! Vorher gab es nur 3 Werte zu einem Pixel (RGB) jetzt 4 -der A-Wert
|
| 432 |
+
# Der 4te Wert ist standardmäßig =255 deckend im Alpha-Kanal, im RGB-Bild ist es weiß
|
| 433 |
edited_rgba = rgb_only.convert("RGBA")
|
| 434 |
|
| 435 |
+
# Jetzt Alpha setzen. D.h. der 4te Wert jedes Pixels wird mit den Werten aus der SAM-Maske überschrieben. A=255 da wo segmentiert
|
| 436 |
+
# und A=0 (transparent) da wo nicht segmentiert! Da wo transparent sieht man natürlich das Original!
|
| 437 |
+
# putalpha macht das Inpaint-bild an den Stellen transparent an denen die SAM-Maske schwarz ist!
|
| 438 |
edited_rgba.putalpha(alpha_mask)
|
| 439 |
|
| 440 |
# DEBUG: Prüfe wirklich was drin ist
|
|
|
|
| 477 |
return final_image.convert("RGB")
|
| 478 |
|
| 479 |
|
| 480 |
+
|
| 481 |
def auto_detect_face_area(image):
|
| 482 |
"""Optimierten Vorschlag für Gesichtsbereich ohne externe Bibliotheken"""
|
| 483 |
width, height = image.size
|