Python去除圖片背景的兩種方式介紹
1.使用rembg去除圖像背景
rembg 是一個開源的 Python 庫,專門用于去除圖像背景,它利用深度神經(jīng)網(wǎng)絡(luò)能夠準(zhǔn)確地識別并去除圖像背景,使用戶無需進(jìn)行復(fù)雜的手動編輯,只需幾行代碼即可獲得專業(yè)效果。Rembg 基于 U2-Net 架構(gòu),有多種架構(gòu)修改和經(jīng)過測試的方法以提供最佳結(jié)果,還提供對 GPU 安裝的訪問以實現(xiàn)更快的處理。
安裝依賴:
pip install rembg
示例代碼:
from rembg import remove
from PIL import Image
import numpy as np
import cv2
def remove_background(source_image_path):
# 打開要處理的圖片
input_image = Image.open(source_image_path)
# 使用 rembg 去除背景
output_image = remove(input_image,
alpha_matting=False
)
# 將 PIL.Image 轉(zhuǎn)換為 OpenCV 格式
output_image_array = np.array(output_image)
# 如果是 RGBA 圖像,轉(zhuǎn)換為 BGRA(OpenCV 使用 BGRA 格式)
if output_image_array.shape[2] == 4:
output_image_bgra = cv2.cvtColor(output_image_array, cv2.COLOR_RGBA2BGRA)
else:
output_image_bgra = cv2.cvtColor(output_image_array, cv2.COLOR_RGB2BGR)
return output_image_bgra2.使用U2-NET去除圖像背景
U2-Net 是一種用于顯著目標(biāo)檢測的深度學(xué)習(xí)模型,在 CVPR2020 開源后備受關(guān)注。其具有兩層嵌套的 U 型結(jié)構(gòu),底層是帶有新穎的 ReSidual U-Block(RSU)模塊,可在不降低特征圖分辨率的情況下提取多尺度特征;頂層則類似于 U-Net 結(jié)構(gòu),每個階段都由 RSU 填充,這種結(jié)構(gòu)使網(wǎng)絡(luò)能夠在不顯著增加內(nèi)存和計算成本的情況下,加深網(wǎng)絡(luò)并獲得高分辨率特征圖,從而有效捕捉顯著目標(biāo)的多尺度信息。
示例代碼:
import torch
import os
import cv2
import numpy as np
from torchvision import transforms
from PIL import Image
import torch.nn as nn
from torch.nn import BatchNorm2d
from u2net import U2NET
from base_util import get_images_in_dir
# 定義U-2-Net模型結(jié)構(gòu)
class REBNCONV(nn.Module):
def __init__(self, in_ch=3, out_ch=3, dirate=1):
super(REBNCONV, self).__init__()
self.conv_s1 = nn.Conv2d(in_ch, out_ch, 3, padding=1 * dirate, dilation=1 * dirate)
self.bn_s1 = BatchNorm2d(out_ch)
self.relu_s1 = nn.ReLU(inplace=True)
def forward(self, x):
hx = x
xout = self.relu_s1(self.bn_s1(self.conv_s1(hx)))
return xout
# 定義U-2-Net模型的其他組件...
def normPRED(d):
ma = torch.max(d)
mi = torch.min(d)
dn = (d - mi) / (ma - mi)
return dn
def remove_background(input_path, output_path, model_path='models/u2net.pth'):
# 加載模型
net = U2NET(3,1)
net.load_state_dict(torch.load(model_path))
if torch.cuda.is_available():
net.cuda()
net.eval()
# 讀取圖像
img = Image.open(input_path).convert('RGB')
# 圖像預(yù)處理
transforms_list = []
transforms_list.append(transforms.Resize((320, 320)))
transforms_list.append(transforms.ToTensor())
transforms_list.append(transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5]))
transform = transforms.Compose(transforms_list)
image = transform(img)
image = image.unsqueeze(0)
# 模型推理
if torch.cuda.is_available():
image = image.cuda()
with torch.no_grad():
d1, d2, d3, d4, d5, d6, d7 = net(image)
# 獲取預(yù)測結(jié)果
pred = d1[:, 0, :, :]
pred = normPRED(pred)
# 將預(yù)測結(jié)果轉(zhuǎn)換為掩碼
predict = pred.squeeze()
predict_np = predict.cpu().data.numpy()
mask = Image.fromarray((predict_np * 255).astype(np.uint8))
mask = mask.resize(img.size, resample=Image.BILINEAR)
# 應(yīng)用閾值處理掩碼
mask_threshold = 0.5 # 閾值可以根據(jù)實際情況調(diào)整
mask_array = np.array(mask)
mask_array = np.where(mask_array > mask_threshold * 255, 255, 0).astype(np.uint8)
kernel = np.ones((3, 3), np.uint8) # 定義膨脹核
mask_array = cv2.dilate(mask_array, kernel, iterations=1)
# 應(yīng)用掩碼到原始圖像
img_array = np.array(img)
# 創(chuàng)建透明背景的圖像
transparent_img = np.zeros((img_array.shape[0], img_array.shape[1], 4), dtype=np.uint8)
transparent_img[:, :, :3] = img_array
transparent_img[:, :, 3] = mask_array
# 保存結(jié)果
Image.fromarray(transparent_img).save(output_path)
print(f"已保存處理后的圖像到: {output_path}")到此這篇關(guān)于Python去除圖片背景的兩種方式介紹的文章就介紹到這了,更多相關(guān)Python去除圖片背景內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Django配置多個環(huán)境的MySQL數(shù)據(jù)庫的完整指南
在?Django?項目中配置多個環(huán)境的?MySQL?數(shù)據(jù)庫是一個常見的需求,本文為大家詳細(xì)介紹了配置的完整方法,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-04-04
Python使用Keras庫中的LSTM模型生成新文本內(nèi)容教程
Python語言使用金庸小說文本庫,對文本進(jìn)行預(yù)處理,然后使用Keras庫中的LSTM模型創(chuàng)建和訓(xùn)練了模型,根據(jù)這個模型,我們可以生成新的文本,并探索小說的不同應(yīng)用2024-01-01
python應(yīng)用之如何使用Python發(fā)送通知到微信
現(xiàn)在通過發(fā)微信信息來做消息通知和告警已經(jīng)很普遍了,下面這篇文章主要給大家介紹了關(guān)于python應(yīng)用之如何使用Python發(fā)送通知到微信的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-03-03
Python操作PDF實現(xiàn)制作數(shù)據(jù)報告
Python操作PDF的庫有很多,比如PyPDF2、pdfplumber、PyMuPDF等等。本文將利用FPDF模塊操作PDF實現(xiàn)制作數(shù)據(jù)報告,感興趣的小伙伴可以嘗試一下2022-12-12
Django模板標(biāo)簽中url使用詳解(url跳轉(zhuǎn)到指定頁面)
這篇文章主要介紹了Django模板標(biāo)簽中url使用詳解(url跳轉(zhuǎn)到指定頁面),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03
openstack中的rpc遠(yuǎn)程調(diào)用的方法
今天通過本文給大家分享openstack中的rpc遠(yuǎn)程調(diào)用的方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2021-07-07
python正則表達(dá)式去掉數(shù)字中的逗號(python正則匹配逗號)
在處理自然語言時123,000,000如果以標(biāo)點(diǎn)符號分割,就會出現(xiàn)問題,好好的一個數(shù)字就被逗號肢解了,因此可以先下手把數(shù)字處理干凈(逗號去掉)2013-12-12
Django定制Admin頁面詳細(xì)實例(展示頁面和編輯頁面)
django自帶的admin因為功能和樣式比較簡陋,常常需要再次定制,下面這篇文章主要給大家介紹了關(guān)于Django定制Admin頁面(展示頁面和編輯頁面)的相關(guān)資料,需要的朋友可以參考下2023-06-06

