Daniel251's picture
Update app.py
ad55df9 verified
Raw
History Blame Contribute Delete
9.65 kB
"""
🎨 Background Remover
Remove fundos de imagens automaticamente usando IA
Otimizado para Hugging Face Spaces
"""
import gradio as gr
from PIL import Image
import numpy as np
import sys
import os
import tempfile
from datetime import datetime
print("=" * 60)
print("🚀 INICIANDO APP 3: BACKGROUND REMOVER")
print(f"Python version: {sys.version}")
print("=" * 60)
# ========== CONFIGURAÇÃO ==========
print("📦 Modo: rembg (CPU-friendly)")
# Importa rembg (biblioteca leve para remoção de fundo)
try:
from rembg import remove
print("✅ rembg importado com sucesso")
except ImportError:
print("⚠️ rembg não encontrado, usando método fallback")
remove = None
def remove_background(image):
"""Remove o fundo da imagem"""
if image is None:
return None, "❌ Por favor, envie uma imagem primeiro", None
try:
# Converte para PIL se necessário
if isinstance(image, np.ndarray):
image = Image.fromarray(image)
# Converte para RGB se necessário
if image.mode != 'RGB':
image = image.convert('RGB')
print(f"📸 Processando imagem: {image.size}")
# Usa rembg se disponível
if remove is not None:
output = remove(image)
print("✅ Fundo removido com rembg")
else:
# Fallback: cria transparência simples baseada em cor
output = create_simple_transparency(image)
print("⚠️ Usando método fallback")
# Salva para download
temp_file = save_for_download(output)
return output, "✅ Fundo removido com sucesso!", temp_file
except Exception as e:
error_msg = f"❌ Erro ao remover fundo: {str(e)}"
print(error_msg)
return None, error_msg, None
def create_simple_transparency(image):
"""Método fallback para criar transparência"""
img_array = np.array(image)
# Cria canal alpha
alpha = np.ones((img_array.shape[0], img_array.shape[1]), dtype=np.uint8) * 255
# Detecta cor dominante nos cantos (provavelmente fundo)
corners = [
img_array[0, 0],
img_array[0, -1],
img_array[-1, 0],
img_array[-1, -1]
]
bg_color = np.mean(corners, axis=0).astype(np.uint8)
# Cria máscara baseada em similaridade com a cor de fundo
diff = np.abs(img_array.astype(float) - bg_color.astype(float))
mask = np.mean(diff, axis=2) < 30 # threshold de similaridade
alpha[mask] = 0
# Combina com a imagem original
result = Image.fromarray(np.dstack([img_array, alpha]))
return result
def save_for_download(image):
"""Salva imagem temporariamente para download"""
if image is None:
return None
# Cria arquivo temporário
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
temp_file = tempfile.NamedTemporaryFile(delete=False, suffix=f"_bg_removed_{timestamp}.png")
# Salva imagem
image.save(temp_file.name, format="PNG")
print(f"💾 Imagem salva: {temp_file.name}")
return temp_file.name
def add_solid_background(image, bg_color):
"""Adiciona fundo sólido colorido"""
if image is None:
return None, "❌ Remova o fundo primeiro", None
try:
# Converte hex para RGB
bg_color = bg_color.lstrip('#')
r, g, b = tuple(int(bg_color[i:i+2], 16) for i in (0, 2, 4))
# Cria nova imagem com fundo colorido
background = Image.new('RGB', image.size, (r, g, b))
if image.mode == 'RGBA':
background.paste(image, (0, 0), image)
else:
background.paste(image, (0, 0))
# Salva para download
temp_file = save_for_download(background)
return background, f"✅ Fundo {bg_color} adicionado!", temp_file
except Exception as e:
return None, f"❌ Erro: {str(e)}", None
def add_gradient_background(image, color1, color2):
"""Adiciona fundo com gradiente"""
if image is None:
return None, "❌ Remova o fundo primeiro", None
try:
# Converte cores
c1 = tuple(int(color1.lstrip('#')[i:i+2], 16) for i in (0, 2, 4))
c2 = tuple(int(color2.lstrip('#')[i:i+2], 16) for i in (0, 2, 4))
# Cria gradiente
width, height = image.size
gradient = np.zeros((height, width, 3), dtype=np.uint8)
for y in range(height):
ratio = y / height
color = tuple(int(c1[i] * (1 - ratio) + c2[i] * ratio) for i in range(3))
gradient[y, :] = color
background = Image.fromarray(gradient)
if image.mode == 'RGBA':
background.paste(image, (0, 0), image)
else:
background.paste(image, (0, 0))
# Salva para download
temp_file = save_for_download(background)
return background, "✅ Gradiente adicionado!", temp_file
except Exception as e:
return None, f"❌ Erro: {str(e)}", None
def add_blur_background(image, blur_strength):
"""Adiciona fundo desfocado da própria imagem"""
if image is None:
return None, "❌ Remova o fundo primeiro", None
try:
from PIL import ImageFilter
# Cria versão desfocada
if image.mode == 'RGBA':
rgb_image = image.convert('RGB')
else:
rgb_image = image.copy()
blurred = rgb_image.filter(ImageFilter.GaussianBlur(radius=blur_strength))
if image.mode == 'RGBA':
blurred.paste(image, (0, 0), image)
# Salva para download
temp_file = save_for_download(blurred)
return blurred, "✅ Fundo desfocado adicionado!", temp_file
except Exception as e:
return None, f"❌ Erro: {str(e)}", None
# ========== INTERFACE GRADIO ==========
print("🎨 Criando interface Background Remover...")
with gr.Blocks(title="🎨 Background Remover - Photoshop AI App 3", theme=gr.themes.Soft()) as demo:
gr.Markdown("""
# 🎨 Background Remover
### Remove fundos de imagens automaticamente usando IA
**Como usar:**
1. 📸 Faça upload de uma imagem
2. ✂️ Clique em "Remover Fundo"
3. 🎨 Adicione um novo fundo (opcional)
4. 💾 Baixe o resultado usando o botão abaixo
""")
with gr.Row():
with gr.Column():
input_image = gr.Image(label="📸 Imagem Original", type="pil")
with gr.Row():
remove_btn = gr.Button("✂️ Remover Fundo", variant="primary", size="lg")
gr.Markdown("### 🎨 Adicionar Novo Fundo (Opcional)")
with gr.Tab("🎨 Cor Sólida"):
bg_color = gr.ColorPicker(label="Cor do Fundo", value="#FFFFFF")
solid_btn = gr.Button("Aplicar Cor Sólida")
with gr.Tab("🌈 Gradiente"):
with gr.Row():
grad_color1 = gr.ColorPicker(label="Cor 1", value="#667eea")
grad_color2 = gr.ColorPicker(label="Cor 2", value="#764ba2")
gradient_btn = gr.Button("Aplicar Gradiente")
with gr.Tab("💫 Desfoque"):
blur_strength = gr.Slider(5, 50, value=20, step=5, label="Intensidade")
blur_btn = gr.Button("Aplicar Desfoque")
with gr.Column():
output_image = gr.Image(label="✨ Resultado", type="pil")
status_text = gr.Textbox(label="📊 Status", interactive=False)
# Arquivo para download
download_file = gr.File(label="💾 Baixar Imagem Processada", visible=True)
# Exemplos
gr.Markdown("### 📋 Exemplos")
if os.path.exists("examples"):
gr.Examples(
examples=[
["examples/person.jpg"],
["examples/product.jpg"],
],
inputs=input_image,
label="Clique para testar"
)
# Informações
gr.Markdown("""
### ℹ️ Informações
- ✅ Suporta JPG, PNG, WEBP
- ✅ Processamento automático com IA
- ✅ Exporta PNG com transparência
- ✅ Adicione fundos personalizados
- ✅ Download direto da imagem processada
### 💡 Dicas
- Use imagens com boa iluminação para melhores resultados
- Fundos uniformes são mais fáceis de remover
- O PNG mantém a transparência
- Experimente diferentes fundos para ver o que fica melhor
- Clique no arquivo acima para baixar a imagem
---
**🔗 Parte do Photoshop AI Ecosystem** | App 3 de 10
""")
# Event handlers
remove_btn.click(
fn=remove_background,
inputs=[input_image],
outputs=[output_image, status_text, download_file]
)
solid_btn.click(
fn=add_solid_background,
inputs=[output_image, bg_color],
outputs=[output_image, status_text, download_file]
)
gradient_btn.click(
fn=add_gradient_background,
inputs=[output_image, grad_color1, grad_color2],
outputs=[output_image, status_text, download_file]
)
blur_btn.click(
fn=add_blur_background,
inputs=[output_image, blur_strength],
outputs=[output_image, status_text, download_file]
)
print("=" * 60)
print("✅ APP 3: BACKGROUND REMOVER PRONTO!")
print("=" * 60)
if __name__ == "__main__":
demo.launch()