您好,登錄后才能下訂單哦!
小編給大家分享一下基于OpenCV python3怎么實現證件照換背景的方法,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
軟件環境:
python3.5
opencv2
windows 10
圖像載入
導入opencv庫,使用imread函數讀取圖片
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)
原圖如下
(圖片源于網絡,已經馬賽克處理,如有侵權,私信立即刪除)
獲取背景區域
首先將讀取的圖像默認BGR格式轉換為HSV格式,然后通過inRange函數獲取背景的mask。
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)
獲得的mask如下圖
如圖所示藍色的背景在圖中用白色表示,白色區域就是要替換的部分,但是黑色區域內有白點干擾,所以進一步優化。
腐蝕和膨脹
#腐蝕膨脹 erode=cv2.erode(mask,None,iterations=1) cv2.imshow('erode',erode) dilate=cv2.dilate(erode,None,iterations=1) cv2.imshow('dilate',dilate)
經過腐蝕和膨脹操作后如下圖
處理后圖像單獨白色點消失。
替換背景色
遍歷全部像素點,如果該顏色為dilate里面為白色(255)則說明該點所在背景區域,于是在原圖img中進行顏色替換。
#遍歷替換 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)
最終結果如下
(圖片源于網絡,已經馬賽克處理,如有侵權,私信立即刪除)
總結
最開始想直接通過遍歷全圖進行替換背景色,但是圖像中難免有些像素點和背景色一樣,造成了干擾,導致最后結果不盡人意,所以想通過這種方法進行處理。顯然最后有明顯的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) #轉換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()
以上是“基于OpenCV python3怎么實現證件照換背景的方法”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。