0. Einführung
Ich habe Beiträge für Entwickler vorbereitet, die sich für die digitale Bildverarbeitung interessieren oder Bildverarbeitung in realen Projekten durchführen müssen.
Das Entfernen des Hintergrunds aus Fotos oder das Extrahieren von Hauptfarben wird in verschiedenen Bereichen wie digitale Kunst, Webentwicklung, mobilen Apps, Machine-Learning-Projekten usw. eingesetzt.
Obwohl es kompliziert erscheinen mag, solche Aufgaben auszuführen, ist es tatsächlich sehr einfach.
Durch die Verwendung von FastAPI, rembg und der Python-Bibliothek extcolors können diese Aufgaben leicht in APIs umgewandelt und in verschiedenen Anwendungen verwendet werden. In diesem Beitrag werde ich Sie Schritt für Schritt durch die Erstellung einer leistungsstarken Bildverarbeitungs-API führen, indem ich diese drei Tools kombiniere.
1. Einrichten der Grundstruktur von FastAPI
1.1. Installation der erforderlichen Pakete
Installieren Sie fastapi und uvicorn, um es auszuführen.
pip install fastapi
pip install uvicorn
1.2. Ausgabe von Hello World
Fügen Sie den folgenden Code zu main.py hinzu:
# 패키지 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)
Wir werden host auf '0.0.0.0' und port auf 5000 setzen.
1.3. Starten des uvicorn-Servers
Geben Sie Folgendes in Ihr Terminal ein:
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
Der uvicorn-Server läuft jetzt unter http://127.0.0.1:8000!
Sie können sehen, dass die Rückgabewerte auf der Startseite ordnungsgemäß angezeigt werden.
2. Erstellen einer API zum Entfernen des Hintergrunds und Extrahieren von Farben
2.1. Installation der erforderlichen Pakete
Installieren Sie die erforderlichen Pakete, um die API zu erstellen:
pip install image
pip install rembg
pip install extcolors
Importieren Sie wie folgt:
import os
import request
from PIL import Image
from extcolors import extract_from_image
from rembg import remove
2.2. Hilfsfunktion zum Speichern von Bildern
Lassen Sie uns zuerst eine Hilfsfunktion erstellen, die eine Bild-URL erhält und die Bilddatei speichert.
Im HTML-<img>-Tag gibt es ein src-Attribut. Die folgende Funktion greift darauf zu und lädt die Bilddatei herunter.
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. Hilfsfunktion zum Konvertieren von RGB in HEX
Es gibt verschiedene Möglichkeiten, Farben anzuzeigen. Diese API extrahiert Farben und liefert RGB- und HEX-Informationen.
Lassen Sie uns eine Hilfsfunktion erstellen, die die Farben aus dem Bild extrahiert, RGB erhält und in HEX umwandelt.
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. Funktion für den Hintergrundentfernungs-Endpunkt
http://127.0.0.1:8000/rembg/{IMAGE_URL}
Wenn Sie auf eine solche URL zugreifen, wird nach dem Speichern des Bildes der Hintergrund entfernt und eine Funktion für den Endpunkt erstellt, die den Bildpfad und den Bildnamen zurückgibt.
@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
Ergebnis der Ausführung:
Ich habe den folgenden Bild-URL eingegeben:
Ich habe erfolgreich den Pfad des Bildes, von dem der Hintergrund entfernt wurde, und den Bildnamen erhalten.
...
(Translated text is too long. Please divide and submit separately for accurate translation)




