2020-11-06 Python OpenCV给证件照换底色
投簡(jiǎn)歷、找工作這些事都需要證件照,有些還要求證件照背景顏色、尺寸大小,本文分享一下如果通過(guò)Python OpenCV來(lái)實(shí)現(xiàn)照片裁剪和更換背景色
1、讀取照片
?
import cv2import?numpy?as?np# 讀取照片image = cv2.imread('1.jpg')2、修改照片尺寸
發(fā)現(xiàn)圖片太大,修改圖片尺寸
image = cv2.resize(image,None,fx=0.5,fy=0.5)
第一個(gè)參數(shù)image:為原始圖像
第二個(gè)參數(shù)size:尺寸數(shù)組,我設(shè)置None
第三個(gè)和第四個(gè)參數(shù)fx,fy:新圖為原圖的比例。
比例和尺寸只能設(shè)置一個(gè)
???????
# 修改尺寸image?=?cv2.resize(image,?None,?fx=0.5,?fy=0.5)3、BGR圖片轉(zhuǎn)灰度圖
彩色圖無(wú)法進(jìn)行梯度閉運(yùn)算。
閉運(yùn)算:對(duì)圖像先進(jìn)行膨脹再腐蝕,有助于關(guān)閉前景物體上的小孔或者小黑點(diǎn)
形態(tài)學(xué)變換:開(kāi)運(yùn)算,閉運(yùn)算,梯度運(yùn)算
所以先將圖片轉(zhuǎn)換為hsv格式
cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
可以將彩色圖片轉(zhuǎn)化為hsv灰度圖片
轉(zhuǎn)換成hsv是因?yàn)?#xff0c;hsv的色彩空間有表可查。???????
# 圖片轉(zhuǎn)換為二值化圖hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)print(hsv)4、圖片二值化處理
形態(tài)學(xué)變換需要的是二值圖片。
cv2.inRange(hsv,lower_red,upper_red)
hsv:圖像
lower_red指的是圖像中低于這個(gè)lower_red的值,圖像值變?yōu)?
upper_red指的是圖像中高于這個(gè)upper_red的值,圖像值變?yōu)?
而在lower_red~upper_red之間的值變成255。
完成二值變換。
每張圖的lower_red,upper_red 不同。自己可以查找hsv色彩空間表。然后結(jié)合,修改數(shù)值。
# 圖片的二值化黑白處理lower_blue = np.array([90, 70, 70])upper_blue = np.array([110, 255, 255])heibai = cv2.inRange(hsv, lower_blue, upper_blue)# 顯示cv2.imshow('image', image)cv2.imshow('hsv', hsv)cv2.imshow('heibai', heibai)# 無(wú)限等待cv2.waitKey(0)# 銷毀內(nèi)存cv2.destroyAllWindows()5、圖片去噪
黑白色的照片周圍可能有黑色小點(diǎn)噪聲。這種情況下需要去除背景色噪聲,選用膨脹。
膨脹即對(duì)圖片高亮色進(jìn)行膨脹。周圍只有有一個(gè)為1,即是1;再進(jìn)行腐蝕,縮小圖片尺寸。即閉運(yùn)算操作。
不同的圖片噪聲不一樣,如是前景色人物含有小白點(diǎn),則進(jìn)行開(kāi)運(yùn)算操作。
這次顏色的圖片中因?yàn)轭伾置?#xff0c;不存在明顯噪音,如果去除噪音可以采用下面方法
???????
# 閉運(yùn)算k = np.ones((5, 5), np.uint8)r = cv2.morphologyEx(heibai, cv2.MORPH_CLOSE, k)6、圖片顏色替換
遍歷黑白照,找到白色像素點(diǎn)的位置索引,同理找到原圖(白色像素點(diǎn)對(duì)應(yīng)位置索引),換成顏色替換。
???????
# 顏色替換imageNew = np.copy(image)rows, cols, channels = image.shapefor i in range(rows): for j in range(cols): if r[i, j] == 255: # 像素點(diǎn)為255表示的是白色,我們就是要將白色處的像素點(diǎn),替換為紅色 imageNew[i, j] = (0, 0, 255) # 此處替換顏色,為BGR通道,不是RGB通道?
完整代碼:
import cv2import numpy as np # 讀取照片image = cv2.imread('1.jpg')# 修改尺寸image = cv2.resize(image, None, fx=0.5, fy=0.5)# 圖片轉(zhuǎn)換為二值化圖hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)print(hsv)# 圖片的二值化黑白處理lower_blue = np.array([90, 70, 70])upper_blue = np.array([110, 255, 255])heibai = cv2.inRange(hsv, lower_blue, upper_blue)# 閉運(yùn)算k = np.ones((5, 5), np.uint8)r = cv2.morphologyEx(heibai, cv2.MORPH_CLOSE, k)# 顏色替換imageNew = np.copy(image)rows, cols, channels = image.shapefor i in range(rows): for j in range(cols): if r[i, j] == 255: # 像素點(diǎn)為255表示的是白色,我們就是要將白色處的像素點(diǎn),替換為紅色 imageNew[i, j] = (0, 0, 255) # 此處替換顏色,為BGR通道,不是RGB通道# 顯示cv2.imshow('image', image)cv2.imshow('hsv', hsv)cv2.imshow('heibai', heibai)cv2.imshow('r', r)cv2.imshow('imageNew', imageNew)# 無(wú)限等待cv2.waitKey(0)# 銷毀內(nèi)存cv2.destroyAllWindows()總結(jié)
以上是生活随笔為你收集整理的2020-11-06 Python OpenCV给证件照换底色的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Python OpenCV 图片拆分与拼
- 下一篇: Python代码调试方法