本指南示範如何僅使用Python程式碼取代影像的背景,而不依賴Photoshop等影像編輯軟體。目標是在交換人工智慧生成的背景時保持主體完整。
雖然這種方法可能不是革命性的,但它解決了一個常見的需求,所以我希望它對那些有類似需求的人有所幫助。
讓我們從結果開始。
以下輸出影像是根據下面所示的輸入影像產生的。
安裝請求來處理 API 呼叫。
$ pip install requests
我驗證版本如下:
$ pip list | grep -e requests requests 2.31.0
對於背景生成,我們將使用 Stability AI 的 Web API。
要存取此 API,您需要從其開發者平台取得 API 金鑰。有關定價,請參閱定價頁面。
為了確保金鑰安全,請將其儲存為環境變量,而不是將其硬編碼到程式碼中。
在我的環境中,我使用 zshrc 設定檔。
$ open ~/.zshrc
我將金鑰保存在名稱 STABILITY_API_KEY 下。
export STABILITY_API_KEY=your_api_key_here
在這裡,我們使用刪除背景 API 來隔離主題。然後,我們將提取的圖像傳遞給 Inpaint API 以建立新的背景。
使用的提示是「大玻璃窗,可以看到後面的大都市」
import os import requests # File paths input_path = './input.png' # Original image mask_path = './mask.png' # Mask image (temporarily generated) output_path = './output.png' # Output image # Check for API Key api_key = os.getenv("STABILITY_API_KEY") if api_key is None: raise Exception("Missing Stability API key.") headers = { "Accept": "image/*", "Authorization": f"Bearer {api_key}" } # Call Remove Background API response = requests.post( f"https://api.stability.ai/v2beta/stable-image/edit/remove-background", headers=headers, files={ "image": open(input_path, "rb") }, data={ "output_format": "png" }, ) # Save mask image if response.status_code == 200: with open(mask_path, 'wb') as file: file.write(response.content) else: raise Exception(str(response.json())) # Call Inpaint API response = requests.post( "https://api.stability.ai/v2beta/stable-image/edit/inpaint", headers=headers, files={ "image": open(mask_path, "rb"), }, data={ "prompt": "Large glass windows with a view of the metropolis behind", "output_format": "png", "grow_mask": 0, # Disable blurring around the mask }, ) # Delete mask image os.remove(mask_path) # Save output image if response.status_code == 200: with open(output_path, "wb") as file: file.write(response.content) else: raise Exception(str(response.json()))
背景去除的另一種方法是使用 rembg。這種方法只需要呼叫一次API,成本效益更高,但可能會導致提取精度的差異。
首先,安裝rembg。
$ pip install rembg
我驗證版本如下:
$ pip list | grep -e rembg rembg 2.0.59
這是此方法的程式碼:
from rembg import remove import os import requests # File paths input_path = './input.png' # Input image path mask_path = './mask.png' # Mask image path (temporarily generated) output_path = './output.png' # Output image path # Generate mask image with background removed with open(input_path, 'rb') as i: with open(mask_path, 'wb') as o: input_image = i.read() mask_image = remove(input_image) o.write(mask_image) # Check for API Key api_key = os.getenv("STABILITY_API_KEY") if api_key is None: raise Exception("Missing Stability API key.") # Call Inpaint API response = requests.post( "https://api.stability.ai/v2beta/stable-image/edit/inpaint", headers={ "Accept": "image/*", "Authorization": f"Bearer {api_key}" }, files={ "image": open(mask_path, "rb"), }, data={ "prompt": "Large glass windows with a view of the metropolis behind", "output_format": "png", "grow_mask": 0, }, ) # Delete mask image os.remove(mask_path) # Save output image if response.status_code == 200: with open(output_path, "wb") as file: file.write(response.content) else: raise Exception(str(response.json()))
這是輸出影像。在這種情況下,提取的準確性似乎令人滿意。
如果您設定本地穩定擴散環境,則可以消除 API 呼叫成本,因此,如果該選項適合您的需求,請隨意探索。
僅透過程式碼即可實現這一點,非常方便。
很高興見證工作流程效率的持續改善。
我使用 Stable Diffusion 的 Web API 僅用 AI 生成替換背景,同時保留圖像中的人物原樣。
以上是使用穩定擴散 Web API 透過 AI 產生僅替換影像的背景的詳細內容。更多資訊請關注PHP中文網其他相關文章!