Crear una API para eliminar el fondo y extraer colores de una imagen utilizando FastAPI, rembg y extcolors.

Publicación sobre cómo crear una API para eliminar fondos y extraer colores de fotos utilizando FastAPI, rembg y extcolors. Cubre procesamiento de imágenes, estructura básica de FastAPI, ejecución de servidor uvicorn, creación de API, entre otros.

8
Crear una API para eliminar el fondo y extraer colores de una imagen utilizando FastAPI, rembg y extcolors.

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!

imagen de notion

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

imagen de notion

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:

imagen de notion

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)

Comments

Add Comment

Your email won't be published and will only be used for reply notifications.

Sigue leyendo

Get notified of new posts

We'll email you when 해시스크래퍼 기술 블로그 publishes new content.

Your email will only be used for new post notifications.