【Python】一鍵摳圖,3行代碼實現照片/證件照換背景色

前言:

今天上課,老師剛好說到了這個,證件照換底色之前也寫過,但老師說他用的很厲害的Pyhon新的庫,就想再回顧一下,順便梳理一下流程和所用知識點。

對於不會PS的小夥伴,摳圖是一個難度係數想當高的活,某寶照片摳圖和證件照換底色價格都是幾元左右,那麼對於程序員來說,即使不會P圖,我們也可以完成自己更換

通過本篇博客,你只需要有一點Pyhon基礎,便可以實現自己理解並完成整個代碼。

每個代碼部分下方都會有原理講解

那麼接下來,我們會分別從不同的方式來講解Python實現照片換底色的方法,分別是:

  • 使用removebg 工具
  • 使用Python PIL/Pillow庫
  • python matplotlib模塊和nump模塊
  • python numpy函數庫opencv庫

Python實現照片

removebg

官網:
https://www.remove.bg

簡介:Remove Image Background(後面簡稱:Re­move.bg),它基於 Python、Ruby 和深度學習技術開發,通過強大的 AI 人工智能算法實現自動識別出前景主體與背景圖,完成圖片的背景轉換

在這裏插入圖片描述
目前提供兩種方式:在線摳圖和Python代碼摳圖

在線摳圖

1登錄其官網,註冊登錄,上傳本地圖片或網絡圖片的URL。

官網https://www.remove.bg
在其後方加上/zh可換爲中文 https://www.remove.bg/zh

在這裏插入圖片描述

2.上傳成功後,平臺僅需幾秒鐘實現自動摳圖,可直接下載無背景透明的圖像照片
在這裏插入圖片描述
同時,我們還可以受用自動編輯功能,自行更換圖片背景和調整濾鏡,可以上傳本地背景及濾鏡,點擊Download即可完成下載

默認爲.png格式
在這裏插入圖片描述

Python代碼摳圖

在正常使用開發中,我們需要使用代碼完成一系列功能,而Remove Image Background網站提供了外置的API連接

點擊Tools&API 目前Re­move.bg提供支持

  • Windows / Mac / Linux 平臺的軟件工具
  • 和基於PS外置模塊
  • 還有就是網站的API

在這裏插入圖片描述

使用API 需要註冊賬號方可獲取密鑰,默認生成的圖片格式尺寸是標準的,每月最多免費處理 50 張照片,且每張尺寸大小不超過25MB,如果想生成高清或者處理更多圖片需要付費(在線摳圖方式沒有次數限制)。
在這裏插入圖片描述

註冊Re­move.bg,之後獲取你的API
在這裏插入圖片描述

1.在CMD命令行輸入

pip install removebg

使用pip方式安裝removebg模塊
在這裏插入圖片描述
附錄:

Python安裝模塊的方式,一種是使用pip來安裝,這種安裝方式是使用在線的倉庫來安裝,默認配置的是國外的Python官方庫

pip來開始安裝removebg模塊,命令是:

pip install removebg

然後就會自動連接到對應的倉庫上面去開始下載removebg模塊以及各種依賴模塊,解壓安裝。

Github地址:
https://github.com/brilam/remove-bg

import removebg 導入模塊 如果沒有提示錯誤,則表示安裝成功
在這裏插入圖片描述

單個圖片轉換
from removebg import RemoveBg
rmbg = RemoveBg("Xj97qArdBxxxx, "error.log") # 引號內是你獲取的API
rmbg.remove_background_from_img_file(r"‪C:\Users\48013\Pictures\Cache_4da0f4a375f31d18..jpg") #圖片地址

之後點擊Run運行 即可在文件夾中看到轉換的無背景照片

在這裏插入圖片描述
效果如下:
在這裏插入圖片描述

2批量圖片轉換
from removebg import RemoveBg
import os
  
rmbg = RemoveBg("3Uxxxxxx", "error.log")
path = '%s/picture'%os.getcwd() #圖片放到程序的同級文件夾 picture 裏面
for pic in os.listdir(path):
  rmbg.remove_background_from_img_file("%s\%s"%(path,pic))

把圖片放到一個文件夾就可以實現批量摳圖。

功能: 實現同一文件夾內圖片背景轉換



3使用圖片的URL進行轉換:
from removebg import RemoveBg

rmbg = RemoveBg("YOUR-API-KEY", "error.log")
rmbg.remove_background_from_img_url("http://www.example.com/some_image.jpg")



  
下面我們對幾個函數進行下講解:

remove_background_from_img_file(img_file_path,size,bg_color)

該函數共有三個參數:

參數 描述
img_file_path 圖像文件的路徑
size 輸出圖像的大小(regular=0.25 MP,HD=4MP,4k=最多10 MP)。默認值爲“regular”
bg_color 爲圖片添加純色背景。可以是十六進制顏色代碼(例如:81d4fa,FFF)或顏色名稱(例如green)。

其中: MP的意思是指百萬像素

MP是mega pixel的縮寫。mega意爲一百萬,mega pixel 指意爲100萬像素。
10MP 表示最多到1000萬像素 也就是4K

from removebg import RemoveBg

rmbg = RemoveBg("YOUR-API-KEY", "error.log")
rmbg.remove_background_from_img_file("joker.jpg",size="4k")

當然,普通用戶只能使用一次高清圖片,和一個月50次的regular(1/4MP)的圖片

Python Pillow庫

1. 什麼是Pillow

PIL(Python Image Library)是python的第三方圖像處理庫,但是由於其強大的功能與衆多的使用人數,幾乎已經被認爲是python官方圖像處理庫了。其官方主頁爲:PIL。 PIL歷史悠久,原來是隻支持python2.x的版本的,後來出現了移植到python3的庫pillow,pillow號稱是friendly fork for PIL,其功能和PIL差不多,但是支持python3 又加入了許多新特性,因此,我們可以直接安裝使用Pillow。

1安裝pillow

CMD命令行輸入:

pip install pillow
原理講解:

在讀取RGB圖片時,往往把圖片轉化爲四通道圖片,其中第四個通道是α通道,可以決定圖像的透明度
如果把圖片的前景的透明度設定爲1,背景的透明度設定爲0,那麼就算去掉了背景了

具體點說:需要使用RGBA(Red,Green,Blue,Alpha)格式,將背景的alpha的透明度變爲0,這樣就可以了,

from PIL import Image
img = Image.open(r".\Cache_4da0f4a375f31d18..jpg")   #注意是當前路徑
img = img.convert("RGBA")  # 轉換獲取信息
pixdata = img.load()
for y in range(img.size[1]):
    for x in range(img.size[0]):
        if pixdata[x, y][0] > 220 and pixdata[x, y][1] > 220 and pixdata[x, y][2] > 220 and pixdata[x, y][3] > 220:
            pixdata[x, y] = (255, 255, 255, 0)
img.save(r".\element__2__new.png"))

其實簡單來說,這部分代碼就是獲取圖片的RGB值,然後對顏色較深的背景部分,轉換爲alpha透明度爲0 的透明色 適用於較爲簡單的圖片 自行修改需要判斷的RGB值即可

適合背景顏色單一 且區分較大的情況

我們以下方圖片爲例
在這裏插入圖片描述
此爲閾值爲30時情況 素描圖片
在這裏插入圖片描述
這種方法肯定有一大堆的不足,對於具體的高級過程還是要去學習算法的應用,這裏只是做一個簡單的介紹

python matplotlib模塊和nump模塊

原理和上方原理相同。

這裏我們貼下代碼

import numpy as np
import matplotlib.image as pg
a=pg.imread('a.png')
u,v,w=a.shape
for i in range(u):
	for j in range(v):
		ifa[i,j,2]>2*a[i,j,0] and a[i,j,2]>1.5*a[i,j,1]:
			a[i,j]=np.array([0]*4)
pg.imsave('new.png',a)

numpy函數庫和opencv庫

安裝numpy函數庫
`1.打開網址https://pypi.org/project/numpy/#files,找到安裝的python版本對應的numpy版本。

cp後爲python版本,amd後爲位數

比方說自己的是python3.5, 64位操作系統,所以選擇numpy-1.11.2+mkl-cp35-cp35m-win-amd64.whl

2.將numpy下載到 python的安裝目錄下的scripts文件夾中

3.然後在cmd中執行以下命令

pip3.6 install D:\java\python36\Scripts\numpy-1.13.3-cp36-none-win_amd64.whl

2直接CMD輸入

pip install numpy
在這裏插入圖片描述
安裝OPencv3

後面部分會單獨寫成一篇,講解下OPencv的一些函數
近期會更新

大概的效果如下圖:
使用PyCharm

大體過程
1進行圖片壓縮
2進行背景獲取 BGR轉HSV
3進行腐蝕膨脹濾波
4獲取背景轉換色
5遍歷替換

導入opencv庫,使用imread函數讀取圖片

import cv2
import numpy as np
img=cv2.imread('yay.jpg') #原始圖片

進行縮放

#縮放
rows,cols,channels = img.shape
img=cv2.resize(img,None,fx=0.5,fy=0.5)
rows,cols,channels = img.shape
cv2.imshow('img',img)

獲取背景區域

首先將讀取的圖像默認BGR格式轉換爲HSV格式,然後通過inRange函數獲取背景的mask。

#轉換hsv
hsv=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
lower_blue=np.array([90,70,70])  #HSV顏色範圍參數
 //分離HSV空間,v[0]爲H色調,v[1]爲S飽和度,v[2]爲v灰度
upper_blue=np.array([110,255,255])
mask = cv2.inRange(hsv, lower_blue, upper_blue)
cv2.imshow('Mask', mask)

獲得的mask如下圖
在這裏插入圖片描述

什麼是掩膜(mask
數字圖像處理中的掩膜的概念是借鑑於PCB製版的過程,在半導體制造中,許多芯片工藝步驟採用光刻技術,用於這些步驟的圖形“底片”稱爲掩膜(也稱作“掩模”),其作用是:在硅片上選定的區域中對一個不透明的圖形模板遮蓋,繼而下面的腐蝕或擴散將隻影響選定的區域以外的區域。
圖像掩膜與其類似,用選定的圖像、圖形或物體,對處理的圖像(全部或局部)進行遮擋,來控制圖像處理的區域或處理過程。

1 提取感興趣區:用預先製作的感興趣區掩膜與待處理圖像相乘,得到感興趣區圖像,感興趣區內圖像值保持不變,而區外圖像值都爲0;
2 屏蔽作用:用掩膜對圖像上某些區域作屏蔽,使其不參加處理或不參加處理參數的計算,或僅對屏蔽區作處理或統計;
3 結構特徵提取:用相似性變量或圖像匹配方法檢測和提取圖像中與掩膜相似的結構特徵;
4 特殊形狀圖像的製作。

簡單來說:就是獲取一部份區域,只對這部分區域做處理,或者只對這部分區域外的區域做處理。(在證件照中可以理解爲把人像作爲mask 背景作爲外部處理區域)

而HSV顏色調節範圍這裏不做詳細介紹

簡單的:

HSV代表色調(Hue),飽和度(Saturation)和明度(Value),
而分離HSV空間,v[0]爲H色調,v[1]爲S飽和度,v[2]爲v灰度

此時圖像還需要進行一次濾波處理,過濾掉圖中的一些白點

#腐蝕膨脹
erode=cv2.erode(mask,None,iterations=1)
cv2.imshow('erode',erode)
dilate=cv2.dilate(erode,None,iterations=1)
cv2.imshow('dilate',dilate)

遍歷全部像素點,如果該顏色爲膨脹(dilate)裏面爲白色(255)則說明該點所在背景區域(mask之外的區域),於是在原圖img中進行顏色替換。

#遍歷替換
for i in range(rows):
  for j in range(cols):
    if dilate[i,j]==255:
      img[i,j]=(255,255,255)#此處替換顏色,爲BGR通道
cv2.imwrite('new.jpg',img) #生成的新圖片
cv2.waitKey(0)
cv2.destroyAllWindows()

最後便可以得到新的圖片:
在這裏插入圖片描述
完整代碼如下:

import cv2
import numpy as np
img=cv2.imread('yay.jpg')
#縮放
rows,cols,channels = img.shape
img=cv2.resize(img,None,fx=0.5,fy=0.5)
rows,cols,channels = img.shape
cv2.imshow('img',img)
#轉換hsv
hsv=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
lower_blue=np.array([90,70,70])
upper_blue=np.array([110,255,255])
mask = cv2.inRange(hsv, lower_blue, upper_blue)
cv2.imshow('Mask', mask)
#腐蝕膨脹
erode=cv2.erode(mask,None,iterations=1)
cv2.imshow('erode',erode)
dilate=cv2.dilate(erode,None,iterations=1)
cv2.imshow('dilate',dilate)
#遍歷替換
for i in range(rows):
 for j in range(cols):
 if dilate[i,j]==255:
 img[i,j]=(0,0,255)#此處替換顏色,爲BGR通道
cv2.imshow('res',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

第四行yay.jpg是原圖片路徑

lower_blue=np.array([90,70,70])裏面三個數值可以控制好處理出來的效果和噪點 HSV顏色範圍參數調節

img[i,j]=(0,0,255)#此處替換顏色,爲BGR通道
修改這裏的BGR值即可修改背景顏色

紅色 (0,0,255)
白色 (255,255,255)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章