0. Introducción
He preparado una publicación para desarrolladores interesados en el procesamiento de imágenes digitales o que necesitan procesar imágenes en proyectos reales.
Eliminar el fondo de una foto o extraer colores clave se utiliza en diversos campos como arte digital, desarrollo web, aplicaciones móviles, proyectos de aprendizaje automático, entre otros.
Aunque parece que se necesitan algoritmos complejos o un alto nivel de habilidad para realizar estas tareas, en realidad es algo muy sencillo.
Utilizando las bibliotecas de Python FastAPI, rembg y extcolors, puedes crear fácilmente un API para realizar estas tareas y utilizarlo en diversas aplicaciones. En esta publicación, te guiaré paso a paso sobre cómo combinar estas tres herramientas para construir un poderoso API de procesamiento de imágenes.
1. Estableciendo la estructura básica de FastAPI
1.1. Instalación de paquetes necesarios
Instala fastapi y uvicorn para ejecutarlo.
pip install fastapi
pip install uvicorn
1.2. Imprimir "Hola, mundo"
Escribe el siguiente código en main.py:
# 패키지 import
from fastapi import FastAPI
import uvicorn
# Helper 함수 작성
# app = FastAPI()
# Endpoint 함수 작성
# # 루트 페이지("/") 접속 시 "Hello": "world" return
@app.get("/")
def read_root():
return {
"Hello": "world"
}
if __name__ == "__main__":
uvicorn.run(app, host='0.0.0.0', port=5000)
Estableceremos el host como '0.0.0.0' y el puerto como 5000.
1.3. Ejecutar el servidor uvicorn
Ingresa lo siguiente en la terminal:
uvicorn main:app --reload
INFO: Will watch for changes in these directories: ['PROJECT_DIRECTORY_PATH']
INFO: Uvicorn running on <http://127.0.0.1:8000> (Press CTRL+C to quit)
INFO: Started reloader process [9982] using StatReload
¡El servidor uvicorn está funcionando en http://127.0.0.1:8000!
Puedes confirmar que se muestra correctamente el valor devuelto al acceder a la página raíz.
2. Creación de un API para eliminar el fondo y extraer colores
2.1. Instalación de paquetes necesarios
Instala los paquetes necesarios para crear el API:
pip install image
pip install rembg
pip install extcolors
Importa de la siguiente manera:
import os
import request
from PIL import Image
from extcolors import extract_from_image
from rembg import remove
2.2. Función Helper para guardar imágenes
Primero, crearemos una función Helper que reciba la URL de la imagen y guarde el archivo de imagen.
En la etiqueta src de la etiqueta <img> en HTML, esta función accede a ese atributo para obtener la imagen.
def save_image(image_url):
response = requests.get(image_url)
# 이미지 저장 디렉토리
download_dir_name = 'downloaded_images'
if response.status_code == 200:
# 파일 이름 얻기
image_name = os.path.basename(image_url)
# 파일 이름에 확장자 없다면 추가
exts = [".jpg", ".jpeg", ".png", ".gif"]
ext_included = False
file_ext = None
for ext in exts:
if ext in image_name:
ext_included = True
file_ext = ext
break
if ext_included:
image_name = image_name.split(file_ext)[0] + file_ext
else:
image_name += ".jpeg"
file_ext = ".jpeg"
# 저장 경로 없다면 생성
if not os.path.exists(download_dir_name):
os.makedirs(download_dir_name)
# 파일 경로 얻기
image_path = os.path.join(download_dir_name, image_name)
# 파일 저장
with open(image_path, 'wb') as f:
f.write(response.content)
result = {
"message": "Image saved successfully!",
"status_code": response.status_code,
"image_path": image_path,
"image_name": image_name,
"file_ext": file_ext
}
return result
else:
return {
"message": "Failed to save image",
"status_code": response.status_code
}
2.3. Función Helper para convertir RGB a hexadecimal
Existen varias formas de mostrar colores, en este API extraemos el color y proporcionamos la información de RGB y HEX.
Crearemos una función Helper que extraiga el color de la imagen, convierta RGB a HEX.
def rgb_to_hex(rgb_tuple):
r = int(rgb_tuple[0])
g = int(rgb_tuple[1])
b = int(rgb_tuple[2])
return '#' + hex(r)[2:].zfill(2) + hex(g)[2:].zfill(2) + hex(b)[2:].zfill(2)
2.4. Función de punto final para eliminar el fondo
http://127.0.0.1:8000/rembg/{IMAGE_URL}
Al acceder a esta URL, crearemos una función de punto final que guarda la imagen, elimina el fondo y devuelve la ruta de la imagen y el nombre de la imagen.
@app.get('/rembg/{url:path}')
def remove_image_background(url: str):
image_info = save_image(url) # 이미지 저장
image_path = image_info["image_path"]
image_name = image_info["image_name"]
file_ext = image_info["file_ext"]
image_name_without_ext = image_name.rsplit(file_ext, 1)[0]
image = Image.open(image_path).convert('RGBA')
output = remove(image)
convert_dir_name = 'converted_images'
# 저장 경로 없다면 생성
if not os.path.exists(convert_dir_name):
os.makedirs(convert_dir_name)
out_image_path = os.path.join(convert_dir_name, f'{image_name_without_ext}_rembg.png')
output.save(out_image_path, 'PNG')
result = {
"message": "The background of the image is successfully removed",
"image_path": out_image_path,
"image_name": image_name
}
return result
Resultado de la ejecución:
Hemos ejecutado con la siguiente URL de imagen:
Hemos recibido con éxito la ruta de la imagen con el fondo eliminado y el nombre de la imagen.
...
(El resto del texto ha sido omitido debido a la extensión del contenido original)




