基于OpenCV python3實(shí)現(xiàn)證件照換背景的方法
簡(jiǎn)述
生活中經(jīng)常要用到各種要求的證件照電子版,紅底,藍(lán)底,白底等,大部分情況我們只有其中一種,所以通過(guò)技術(shù)手段進(jìn)行合成,用ps處理證件照,由于技術(shù)不到位,有瑕疵,所以想用python&openCV通過(guò)代碼的方式實(shí)現(xiàn)背景顏色替換,加強(qiáng)一下對(duì)于openCV的學(xué)習(xí),鍛煉一下編碼水平。
軟件環(huán)境:
python3.5
opencv2
windows 10
圖像載入
導(dǎo)入opencv庫(kù),使用imread函數(shù)讀取圖片
import cv2 import numpy as np img=cv2.imread('zjz.jpg')
由于證件照太大,不方便顯示,故進(jìn)行縮放
#縮放 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)
原圖如下
(圖片源于網(wǎng)絡(luò),已經(jīng)馬賽克處理,如有侵權(quán),私信立即刪除)
獲取背景區(qū)域
首先將讀取的圖像默認(rèn)BGR格式轉(zhuǎn)換為HSV格式,然后通過(guò)inRange函數(shù)獲取背景的mask。
HSV顏色范圍參數(shù)可調(diào)節(jié)根據(jù)這篇文章
hsv=cv2.cvtColor(img,cv2.COLOR_BGR2HSV) lower_blue=np.array([78,43,46]) upper_blue=np.array([110,255,255]) mask = cv2.inRange(hsv, lower_blue, upper_blue) cv2.imshow('Mask', mask)
獲得的mask如下圖
如圖所示藍(lán)色的背景在圖中用白色表示,白色區(qū)域就是要替換的部分,但是黑色區(qū)域內(nèi)有白點(diǎn)干擾,所以進(jìn)一步優(yōu)化。
腐蝕和膨脹
#腐蝕膨脹 erode=cv2.erode(mask,None,iterations=1) cv2.imshow('erode',erode) dilate=cv2.dilate(erode,None,iterations=1) cv2.imshow('dilate',dilate)
經(jīng)過(guò)腐蝕和膨脹操作后如下圖
處理后圖像單獨(dú)白色點(diǎn)消失。
替換背景色
遍歷全部像素點(diǎn),如果該顏色為dilate里面為白色(255)則說(shuō)明該點(diǎn)所在背景區(qū)域,于是在原圖img中進(jìn)行顏色替換。
#遍歷替換 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)
最終結(jié)果如下
(圖片源于網(wǎng)絡(luò),已經(jīng)馬賽克處理,如有侵權(quán),私信立即刪除)
總結(jié)
最開(kāi)始想直接通過(guò)遍歷全圖進(jìn)行替換背景色,但是圖像中難免有些像素點(diǎn)和背景色一樣,造成了干擾,導(dǎo)致最后結(jié)果不盡人意,所以想通過(guò)這種方法進(jìn)行處理。顯然最后有明顯的ps痕跡。
最后貼上完整代碼,不足之處歡迎各位指正!
import cv2 import numpy as np img=cv2.imread('zjz.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) #轉(zhuǎn)換hsv hsv=cv2.cvtColor(img,cv2.COLOR_BGR2HSV) lower_blue=np.array([78,43,46]) 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()
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
django 信號(hào)調(diào)度機(jī)制詳解
這篇文章主要介紹了django 信號(hào)調(diào)度機(jī)制詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07用Flask實(shí)現(xiàn)token登錄校驗(yàn)的解決方案
網(wǎng)站、小程序、APP 是否已經(jīng)登錄所代表的狀態(tài),代表一個(gè)概念是登錄態(tài), 我們常用的登錄態(tài)驗(yàn)證方式有cookie,session,token,token提供了另外一種不需要緩存賬戶和密碼的登錄狀態(tài)驗(yàn)證方式,本文給大家介紹了用Flask實(shí)現(xiàn)token登錄校驗(yàn)的解決方案,需要的朋友可以參考下2024-03-03python pygame實(shí)現(xiàn)滾動(dòng)橫版射擊游戲城市之戰(zhàn)
這篇文章主要為大家詳細(xì)介紹了python pygame實(shí)現(xiàn)滾動(dòng)橫版射擊游戲城市之戰(zhàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-11-11python繪制y關(guān)于x的線性回歸線性方程圖像實(shí)例
這篇文章主要為大家介紹了python繪制y關(guān)于x的線性回歸線性方程圖像實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10Pycharm主題切換(禁用)導(dǎo)致UI界面顯示異常的解決方案
這篇文章主要介紹了Pycharm主題切換(禁用)導(dǎo)致UI界面顯示異常的原因分析和解決方案,文中通過(guò)圖文結(jié)合的方式給大家介紹的非常詳細(xì),需要的朋友可以參考下2024-06-06Python 專(zhuān)題三 字符串的基礎(chǔ)知識(shí)
在Python中最重要的數(shù)據(jù)類(lèi)型包括字符串、列表、元組和字典等。本篇文章主要講述Python的字符串基礎(chǔ)知識(shí)。下面跟著小編一起來(lái)看下吧2017-03-03