本指南演示了如何仅使用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中文网其他相关文章!