Update app.py
Browse files
app.py
CHANGED
|
@@ -383,12 +383,21 @@ def enhanced_composite_with_sam(original_image, inpaint_result, original_mask,
|
|
| 383 |
bbox_scaled[3] + y_offset
|
| 384 |
)
|
| 385 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 386 |
# Die BBox-Koordinaten sind durch 2 Punkte gegeben: oben links (x,y)-unten rechts (x,y)
|
| 387 |
# Prüfung: hat BBox gültige Koordinaten
|
| 388 |
if bbox_in_512[2] > bbox_in_512[0] and bbox_in_512[3] > bbox_in_512[1]:
|
| 389 |
# Bearbeiteten Bereich aus dem 512×512-Ergebnis ausschneiden in Größe der 512x512-skalierten BBox
|
| 390 |
edited_region = inpaint_result.crop(bbox_in_512)
|
| 391 |
|
|
|
|
|
|
|
| 392 |
|
| 393 |
# Damit wird der 512er BBox-Inhalt auf Originalgröße-BBox hochskaliert
|
| 394 |
original_bbox_size = (bbox_coords[2] - bbox_coords[0],
|
|
@@ -397,20 +406,31 @@ def enhanced_composite_with_sam(original_image, inpaint_result, original_mask,
|
|
| 397 |
original_bbox_size,
|
| 398 |
Image.Resampling.LANCZOS
|
| 399 |
)
|
|
|
|
|
|
|
|
|
|
| 400 |
|
| 401 |
-
# SAM-Maske= original_mask in Originalgröße (also Smartphone: 4032x3024)Aus dieser Maske muß nun der
|
| 402 |
# Original BBox-Bereich ausgeschnitten werden und
|
| 403 |
mask_cropped = original_mask.crop(bbox_coords)
|
| 404 |
-
|
|
|
|
|
|
|
| 405 |
soft_mask = mask_cropped.filter(ImageFilter.GaussianBlur(3))
|
| 406 |
|
| 407 |
# Alpha-Compositing mit präziser SAM-Maske
|
|
|
|
| 408 |
edited_rgba = edited_region_fullsize.convert("RGBA")
|
|
|
|
|
|
|
| 409 |
mask_rgba = soft_mask.convert("L") # SAM-Maske als Alpha-Kanal
|
| 410 |
-
|
|
|
|
| 411 |
temp_image = Image.new("RGBA", original_bbox_size, (0, 0, 0, 0))
|
|
|
|
| 412 |
temp_image.paste(edited_rgba, (0, 0), mask_rgba)
|
| 413 |
-
|
|
|
|
| 414 |
final_image.paste(temp_image, (bbox_coords[0], bbox_coords[1]), temp_image)
|
| 415 |
|
| 416 |
# Debug-Info
|
|
|
|
| 383 |
bbox_scaled[3] + y_offset
|
| 384 |
)
|
| 385 |
|
| 386 |
+
|
| 387 |
+
print(f"🔍 [COMPOSIT] Original-BBox: {bbox_coords}")
|
| 388 |
+
print(f"🔍 [COMPOSIT] Scale/Offset: {scale_factor}, ({x_offset},{y_offset})")
|
| 389 |
+
print(f"🔍 [COMPOSIT] BBox in 512: {bbox_in_512}")
|
| 390 |
+
print(f"🔍 [COMPOSIT] Inpaint Size: {inpaint_result.size}")
|
| 391 |
+
|
| 392 |
+
|
| 393 |
# Die BBox-Koordinaten sind durch 2 Punkte gegeben: oben links (x,y)-unten rechts (x,y)
|
| 394 |
# Prüfung: hat BBox gültige Koordinaten
|
| 395 |
if bbox_in_512[2] > bbox_in_512[0] and bbox_in_512[3] > bbox_in_512[1]:
|
| 396 |
# Bearbeiteten Bereich aus dem 512×512-Ergebnis ausschneiden in Größe der 512x512-skalierten BBox
|
| 397 |
edited_region = inpaint_result.crop(bbox_in_512)
|
| 398 |
|
| 399 |
+
print(f"🔍 [CROP] Ausgeschnitten: {edited_region.size}")
|
| 400 |
+
|
| 401 |
|
| 402 |
# Damit wird der 512er BBox-Inhalt auf Originalgröße-BBox hochskaliert
|
| 403 |
original_bbox_size = (bbox_coords[2] - bbox_coords[0],
|
|
|
|
| 406 |
original_bbox_size,
|
| 407 |
Image.Resampling.LANCZOS
|
| 408 |
)
|
| 409 |
+
|
| 410 |
+
print(f"🔍 [RESIZE] Original-BBox-Size: {original_bbox_size}")
|
| 411 |
+
print(f"🔍 [RESIZE] Hochskaliert auf: {edited_region_fullsize.size}")
|
| 412 |
|
| 413 |
+
# SAM-Maske= original_mask in Originalgröße (also Smartphone: 4032x3024). Aus dieser Maske muß nun der
|
| 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 |
+
# der Randbereich des BBox-Ausschnittes muß für Übergänge weich gezeichnet werden
|
| 419 |
soft_mask = mask_cropped.filter(ImageFilter.GaussianBlur(3))
|
| 420 |
|
| 421 |
# Alpha-Compositing mit präziser SAM-Maske
|
| 422 |
+
# damit wird auf den neu generirten BBox-Bereich in Originalgröße eine Folie gezogen
|
| 423 |
edited_rgba = edited_region_fullsize.convert("RGBA")
|
| 424 |
+
# Dadurch werden in die Folie der weichen SAM-Maske wieder an den Stellen schwarze/transparente Löcher
|
| 425 |
+
# gerissen wo der Hintergrund innerhalb der BBox bleiben muß!
|
| 426 |
mask_rgba = soft_mask.convert("L") # SAM-Maske als Alpha-Kanal
|
| 427 |
+
|
| 428 |
+
# generiere hiermit ein neues transparantes Bild in original BBox-Größe (unsichtbare Trägerfolie)
|
| 429 |
temp_image = Image.new("RGBA", original_bbox_size, (0, 0, 0, 0))
|
| 430 |
+
# darauf klebe ich die neu generierte Person edited_rgba und SAM-Maske als Löcher-Folie-mask_rgba
|
| 431 |
temp_image.paste(edited_rgba, (0, 0), mask_rgba)
|
| 432 |
+
|
| 433 |
+
# hiermit hole ich mir den Hintergrund außerhalb der BBox zurück!
|
| 434 |
final_image.paste(temp_image, (bbox_coords[0], bbox_coords[1]), temp_image)
|
| 435 |
|
| 436 |
# Debug-Info
|