在我們的生活中常常要用到各種底色要求的證件電子照,紅底、藍底、或者白底,而假如你手上隻有一種底色的證件照,你又不想再去拍又不會PS怎麼辦?今天教你們用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)
3.将圖片轉換為灰度圖像
cv2.cvtColor函數将讀取的圖像默認是BGR格式轉換為HSV格式,将彩色圖片轉換為hsv灰度圖片,之後才能進行腐蝕和膨脹操作。
# 圖片轉換為灰度圖并顯示
hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
cv2.imshow('hsv',hsv)
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)
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)
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)
紅底變藍底
藍底變紅底
變白底
完整代碼,在微信公衆号碼農的後花園回複關鍵字:證件照,下載使用。
更多有關python、深度學習和計算機編程和電腦知識的精彩内容,可以關注碼農的後花園
更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!