Update controlnet_module.py
Browse files- controlnet_module.py +48 -4
controlnet_module.py
CHANGED
|
@@ -1144,21 +1144,65 @@ class ControlNetProcessor:
|
|
| 1144 |
# ============================================================
|
| 1145 |
print("🔄 MASKE AUF ORIGINALGRÖSSE TRANSFORMIEREN")
|
| 1146 |
|
| 1147 |
-
# 1. Maske
|
| 1148 |
mask_crop_pil = Image.fromarray(mask_array).convert("L")
|
| 1149 |
|
| 1150 |
# Leere Maske in Originalgröße
|
| 1151 |
mask_original = Image.new("L", original_image.size, 0)
|
| 1152 |
|
| 1153 |
-
# Crop-Maske an richtiger Position einfügen
|
|
|
|
| 1154 |
mask_original.paste(mask_crop_pil, (crop_x1, crop_y1))
|
| 1155 |
|
| 1156 |
# 2. Rohmaske ebenfalls transformieren
|
| 1157 |
raw_mask_crop_pil = Image.fromarray(raw_mask_array).convert("L")
|
| 1158 |
raw_mask_original = Image.new("L", original_image.size, 0)
|
| 1159 |
raw_mask_original.paste(raw_mask_crop_pil, (crop_x1, crop_y1))
|
| 1160 |
-
|
| 1161 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1162 |
# ============================================================
|
| 1163 |
# ABSCHLIESSENDE STATISTIK
|
| 1164 |
# ============================================================
|
|
|
|
| 1144 |
# ============================================================
|
| 1145 |
print("🔄 MASKE AUF ORIGINALGRÖSSE TRANSFORMIEREN")
|
| 1146 |
|
| 1147 |
+
# 1. Maske in Crop-Größe wird konveriert von NumPy nach PIL
|
| 1148 |
mask_crop_pil = Image.fromarray(mask_array).convert("L")
|
| 1149 |
|
| 1150 |
# Leere Maske in Originalgröße
|
| 1151 |
mask_original = Image.new("L", original_image.size, 0)
|
| 1152 |
|
| 1153 |
+
# Crop-Maske an richtiger Position in leerem Originalbild einfügen
|
| 1154 |
+
# da Hauptprogramm Originalgröße erwartet.
|
| 1155 |
mask_original.paste(mask_crop_pil, (crop_x1, crop_y1))
|
| 1156 |
|
| 1157 |
# 2. Rohmaske ebenfalls transformieren
|
| 1158 |
raw_mask_crop_pil = Image.fromarray(raw_mask_array).convert("L")
|
| 1159 |
raw_mask_original = Image.new("L", original_image.size, 0)
|
| 1160 |
raw_mask_original.paste(raw_mask_crop_pil, (crop_x1, crop_y1))
|
| 1161 |
+
|
| 1162 |
+
|
| 1163 |
+
###################################
|
| 1164 |
+
# Erweiterung der Maske damit mehr Kontext für Inpaint
|
| 1165 |
+
# damit in der BBox keine andere "Jacke" generiert wird
|
| 1166 |
+
# #################################
|
| 1167 |
+
print("👤 FACE_ONLY_CHANGE: Erweitere SAM-Maske um 50%")
|
| 1168 |
+
|
| 1169 |
+
# Originalmaske kopieren (für Debug/Anzeige behalten)
|
| 1170 |
+
original_precise_mask = mask_original.copy()
|
| 1171 |
+
|
| 1172 |
+
# 1. Auf 150% vergrößern
|
| 1173 |
+
expansion_factor = 1.5 # 50% größer
|
| 1174 |
+
expanded_width = int(mask_original.width * expansion_factor)
|
| 1175 |
+
expanded_height = int(mask_original.height * expansion_factor)
|
| 1176 |
+
|
| 1177 |
+
expanded_mask_large = mask_original.resize(
|
| 1178 |
+
(expanded_width, expanded_height),
|
| 1179 |
+
Image.Resampling.LANCZOS
|
| 1180 |
+
)
|
| 1181 |
+
|
| 1182 |
+
# 2. Wieder auf Originalgröße zentriert zurücksetzen
|
| 1183 |
+
mask_original = Image.new("L", original_image.size, 0)
|
| 1184 |
+
|
| 1185 |
+
# Negative Offsets = Maske wird über Bildrand hinaus gelegt
|
| 1186 |
+
x_offset = (expanded_width - mask_original.width) // 2
|
| 1187 |
+
y_offset = (expanded_height - mask_original.height) // 2
|
| 1188 |
+
|
| 1189 |
+
mask_original.paste(expanded_mask_large, (-x_offset, -y_offset))
|
| 1190 |
+
|
| 1191 |
+
# 3. Weichzeichnen für natürliche Übergänge
|
| 1192 |
+
mask_original = mask_original.filter(ImageFilter.GaussianBlur(10))
|
| 1193 |
+
|
| 1194 |
+
print(f"✅ SAM-Maske erweitert: {original_precise_mask.size} → effektiv 150%")
|
| 1195 |
+
print(f" Offsets: x={-x_offset}, y={-y_offset}")
|
| 1196 |
+
|
| 1197 |
+
# RAW-Maske ebenfalls erweitern (für Debug-Anzeige)
|
| 1198 |
+
raw_mask_original = raw_mask_original.resize(
|
| 1199 |
+
(int(raw_mask_original.width * 1.3), int(raw_mask_original.height * 1.3)),
|
| 1200 |
+
Image.Resampling.NEAREST
|
| 1201 |
+
)
|
| 1202 |
+
temp = Image.new("L", original_image.size, 0)
|
| 1203 |
+
temp.paste(raw_mask_original, (-15, -15))
|
| 1204 |
+
raw_mask_original = temp
|
| 1205 |
+
|
| 1206 |
# ============================================================
|
| 1207 |
# ABSCHLIESSENDE STATISTIK
|
| 1208 |
# ============================================================
|