教你用OpenCV 和 Python給證件照換底色(藍底 <->紅底->白底)


在我們的生活中常常要用到各種底色要求的證件電子照,紅底、藍底、或者白底,而假如你手上只有一種底色的證件照,你又不想再去拍又不會PS怎么辦?今天教你們用OpenCV和Python給你的證件照換底色。

教你用OpenCV 和 Python給證件照換底色(藍底 <->紅底->白底)

 

  • Python3
  • numpy函數庫
  • OpenCV庫
  • Windows10 + Anaconda+Pycharm
教你用OpenCV 和 Python給證件照換底色(藍底 <->紅底->白底)

 

1.讀取要換底色的圖片

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

import cv2
import numpy as np

# 讀取照片並顯示
image=cv2.imread('yang.jpg')
cv2.imshow('image',image)

2.對圖片進行縮放

證件照原圖太大,不易顯示,cv2.resize函數進行縮放處理。

# 圖像縮放並顯示
img = cv2.resize(image,None,fx=0.5,fy=0.5)
rows,cols,channels = img.shape
print(rows,cols,channels)
cv2.imshow('img',img)
教你用OpenCV 和 Python給證件照換底色(藍底 <->紅底->白底)

 

3.將圖片轉換為灰度圖像

cv2.cvtColor函數將讀取的圖像默認是BGR格式轉換為HSV格式,將彩色圖片轉換為hsv灰度圖片,之后才能進行腐蝕和膨脹操作。

# 圖片轉換為灰度圖並顯示
hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
cv2.imshow('hsv',hsv)
教你用OpenCV 和 Python給證件照換底色(藍底 <->紅底->白底)

 

4.對圖片進行二值化處理

通過cv2.inRange函數對圖片進行二值化操作,獲取背景的mask,二值化處理是為了將灰度圖片轉換為黑白圖片,如下圖將紅色的背景用白色表示,白色區域就是我們后面遍歷像素點替換的條件,就是將白色的區域替換為藍色。

cv2.inRange(hsv, lower_red, upper_red):在lower_red和upper_red兩個閾值內的像素值設置為白色(255),而不在閾值區間內的像素值設置為黑色(0)。

# 圖片的二值化處理
#紅底變藍底
#將在兩個閾值內的像素值設置為白色(255),而不在閾值區間內的像素值設置為黑色(0)
lower_red= np.array([0,135,135])
upper_red = np.array([180,245,230])
mask = cv2.inRange(hsv, lower_red, upper_red)
# 顯示圖像
cv2.imshow('mask',mask)


# #藍底變紅底
# 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)
教你用OpenCV 和 Python給證件照換底色(藍底 <->紅底->白底)

 

5.對圖片進行腐蝕和膨脹

在進行二值化操作之后,我們可以看到黑色區域有一些噪聲,嘴的部分是白的,還有少數白點,就cv2.erode或者cv2.dilate函數對圖片再進行腐蝕和膨脹操作,均可以有效消除噪聲。

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

dilate=cv2.dilate(erode,None,iterations=1)
cv2.imshow('dilate',dilate)
教你用OpenCV 和 Python給證件照換底色(藍底 <->紅底->白底)

 

6.遍歷像素點替換背景顏色

對上述進行了腐蝕或者膨脹操作的圖片進行像素點遍歷,將白色區域的像素點的位置,也就是原圖的背景部分的像素的對應的位置,替換成你想要替換的底色即可。

dilate[i,j]==255: 像素點為255表示的是白色,我們就要將白色處的像素點,替換為你想要的照片底色。

img[i,j]=(0,0,255): 此處替換顏色,為BGR通道,不是RGB通道,若是想要將紅底變成藍底img[i,j]=(255,0,0),若是想將藍底變為紅底則img[i,j]=(0,0,255),若是想變白底img[i,j]=(255,255,255)

# 遍歷每個像素點,進行顏色的替換
for i in range(rows):
for j in range(cols):
if dilate[i,j]==255: #像素點255表示白色
img[i,j]=(255,0,0) # 此處替換顏色,為BGR通道,不是RGB通道
cv2.imshow('res',img)


# 窗口等待的命令,0表示無限等待
cv2.waitKey(0)

紅底變藍底

教你用OpenCV 和 Python給證件照換底色(藍底 <->紅底->白底)

 

藍底變紅底

教你用OpenCV 和 Python給證件照換底色(藍底 <->紅底->白底)

 

變白底

教你用OpenCV 和 Python給證件照換底色(藍底 <->紅底->白底)

 

完整代碼,關注下面回復:證件照,下載使用。

更多有關python、深度學習和計算機編程和電腦知識的精彩內容,可以關注微信公眾號:碼農的后花園

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM