Files
novafarma/smart_background_removal.py
David Kotnik bf5047e0f0 🎨 UI Assets Consolidation & Reference Cleanup
- Copied 8 missing UI elements from NOVE_SLIKE/UI/ to nova mapa faza 0-1/UI/:
  • amnezija_maska.png
  • gumb_glavni.png
  • merilec_zdravja.png
  • okvir_zarjavel.png
  • srce_health.png
  • zlati_okvir.png
  • amnezia.png
  • gumb_recikliran.png

- Flattened glavna_referenca directory structure:
  • Moved 1836 PNG images from subdirectories to root level
  • Removed folder nesting (Animals, Biomes, Characters, Environment, UI, etc.)
  • All reference images now in single flat directory

- Created smart_background_removal.py:
  • Intelligent background removal preserving character details
  • Protects skin tones and facial features
  • Targets only solid backgrounds (white, green, checkerboard)

Total UI assets: 17 files in production folder
2026-01-22 06:31:53 +01:00

101 lines
3.1 KiB
Python

#!/usr/bin/env python3
"""
Smart Background Removal Script
- Preserves character details (faces, hands)
- Only removes solid backgrounds (white, green, checkerboard)
- Uses tolerance range to avoid removing character colors
"""
from PIL import Image
import os
import sys
def smart_remove_background(image_path, output_path=None):
"""
Odstrani samo čista ozadja, ohrani detajle like
"""
if output_path is None:
output_path = image_path
img = Image.open(image_path).convert("RGBA")
width, height = img.size
pixels = img.load()
# Definiramo barve ozadij za odstranitev
backgrounds_to_remove = [
# Pure White
((245, 245, 245), (255, 255, 255)),
# Pure Green (Chroma Key)
((0, 245, 0), (10, 255, 10)),
# Light Gray (Checkerboard)
((200, 200, 200), (220, 220, 220)),
]
# Varnostna območja - NE BRIŠI teh barv (kože toni)
skin_tones = [
# Light skin
((240, 210, 180), (255, 230, 210)),
# Medium skin
((210, 180, 140), (240, 210, 180)),
# Dark skin
((140, 100, 70), (210, 180, 140)),
]
removed_count = 0
for y in range(height):
for x in range(width):
r, g, b, a = pixels[x, y]
# Preveri, če je to kožni ton - OHRANI
is_skin = False
for (min_r, min_g, min_b), (max_r, max_g, max_b) in skin_tones:
if min_r <= r <= max_r and min_g <= g <= max_g and min_b <= b <= max_b:
is_skin = True
break
if is_skin:
continue # Ohrani piksel
# Preveri, če je to ozadje za odstranitev
for (min_r, min_g, min_b), (max_r, max_g, max_b) in backgrounds_to_remove:
if min_r <= r <= max_r and min_g <= g <= max_g and min_b <= b <= max_b:
pixels[x, y] = (r, g, b, 0) # Naredi transparentno
removed_count += 1
break
img.save(output_path, "PNG")
print(f"{os.path.basename(output_path)}: Removed {removed_count} background pixels")
return removed_count > 0
def process_directory(directory):
"""Process all PNG images in directory"""
processed = 0
for root, dirs, files in os.walk(directory):
for file in files:
if file.lower().endswith('.png'):
file_path = os.path.join(root, file)
try:
if smart_remove_background(file_path):
processed += 1
except Exception as e:
print(f"❌ Error processing {file}: {e}")
print(f"\n✅ Total processed: {processed} images")
if __name__ == "__main__":
if len(sys.argv) < 2:
print("Usage: python3 smart_background_removal.py <directory>")
sys.exit(1)
target_dir = sys.argv[1]
if not os.path.exists(target_dir):
print(f"❌ Directory not found: {target_dir}")
sys.exit(1)
print(f"🔍 Processing images in: {target_dir}")
process_directory(target_dir)
print("✨ Done!")