想要給證件照換底色怎麼辦?
很多人的第一反應用PS,但是你知道嗎?Python裡竟然20行代碼就可以搞定,學會快收藏!
首先我們來準備好需要換證件照:
第一步,我們需要在Python中讀取圖片並且顯示出來。
這裡面要用到的一個模塊是cv2,如果沒有的話使用pip install opencv-python就可以安裝,注意這裡是安裝opencv-python採可以直接用cv2這個模塊。
讀取代碼:
import cv2import numpy as np# 讀取準備好的證件照img=cv2.imread('girl.jpg')# 在屏幕上顯示照片cv2.imshow('img',img)# 設置窗口的等待時間,0表示無限等待cv2.waitKey(0)
這裡imread()函數是用來讀取,imshow()自然是用來展示, waitkey()是設置展示的停留時間,如果沒有展示的時間的話,圖片只會一閃而過。
讀取後我們在屏幕上就可以得到這樣的一張照片。
如果圖片過大的話,可以用resize()這個函數,來控制圖片的大小。
第二步,將圖片轉換為灰度圖像。
啥是灰度圖像呢?來自百度百科的解釋:
灰度數字圖像是每個像素只有一個採樣顏色的圖像。這類圖像通常顯示為從最暗黑色到最亮的白色的灰度,儘管理論上這個採樣可以任何顏色的不同深淺,甚至可以是不同亮度上的不同顏色。灰度圖像與黑白圖像不同,在計算機圖像領域中黑白圖像只有黑白兩種顏色,灰度圖像在黑色與白色之間還有許多級的顏色深度。
圖片需要轉換成灰度圖像是因為圖片有RGB三個顏色通道,我們沒有辦法直接進行腐蝕和膨脹的操作。轉換為灰度圖像的方法也非常簡單,只需要一個代碼。
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
這是時候我們用cv2.imshow('hsv', hsv)來看一下我們得到的結果:
第三步,把圖片進行二值化處理。
圖像二值化( Image Binarization)就是將圖像上的像素點的灰度值設置為0或255,也就是將整個圖像呈現出明顯的黑白效果的過程。
二值化處理用三段代碼來完成:
# 圖片的二值化處理
lower_blue = np.array([90,70,70])
upper_blue = np.array([110,255,255])
mask = cv2.inRange(hsv, lower_blue, upper_blue)
第四步,是圖片的腐蝕和膨脹。
#腐蝕操作:
erode(mask, None, iterations = 1)
#膨脹操作:
dilate(erode, None, iterations = 1)
處理後的結果:
主要是起到對圖片進行去噪聲的過程。
最後一步:顏色替換
終於來到最後一個環節,進行顏色替換,將我們得到的白色底色的像素點替換為紅色。在這裡我們需要遍歷每一個元素。
實現代碼:
rows,cols,channels = img.shape
#遍歷每個像素點,進行顏色的替換
for i in range(rows):
for j in range(cols):
if erode[i,j]==255: # 像素點為255表示的是白色,我們就是要將白色處的像素點,替換為紅色
img[i,j]=(0,0,255) # 此處替換顏色,為BGR通道,不是RGB通道
cv2.imshow('res',img)
這是最後的實現結果。
對比起來人像的邊緣有一些瑕疵,但是大體上達到了我們更換顏色的目的。
另外,這也是真正意義上的像素級操作,在自由度上還是有一定的優勢的。