基於OpenCV python3實現證件照換背景

2021-08-04 20:51:18 字數 2658 閱讀 1105

生活中經常要用到各種要求的證件照電子版,紅底,藍底,白底等,大部分情況我們只有其中一種,所以通過技術手段進行合成,用ps處***照,由於技術不到位,有瑕疵,所以想用python&opencv通過**的方式實現背景顏色替換,加強一下對於opencv的學習,鍛鍊一下編碼水平。

軟體環境:

python3.5

opencv2

windows 10

匯入opencv庫,使用imread函式讀取

由於證件照太大,不方便顯示,故進行縮放(可有可無)

#縮放

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痕跡。

最後貼上完整**,不足之處歡迎各位指正!

#縮放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實現證件照換背景

import cv2 import numpy as np img cv2.imread 4.png 縮放rows,cols,channels img.shape img cv2.resize img,none,fx 0.5,fy 0.5 rows,cols,channels img.shape c...

基於Solr的空間搜尋 3

本文將繼續介紹基於solr的地理位置搜尋的第二種實現方案 cartesiantiers geohash 從基於solr的地理位置搜尋 2 文章中可以看到完全基於geohash的查詢過濾,將完全遍歷整個docment文件,從效率上來看並不太合適,所以結合笛卡爾層後,能有效縮減少過濾範圍,從效能上能很大...

yolov3檢測人頭 基於yolo v3的人臉檢測

一 實驗環境的搭建 1.安裝環境配置 python 3.6 tensorflow gpu 1.6.0 keras pillow opencv python matplotlib numpy 沒有通過pip安裝 例如 pip install keras 2.啟動虛擬環境,並且安裝對應的實驗環境 3.模...