最是人间留不住,朱颜辞镜花辞树。这篇文章主要讲述教你用OpenCV 和 Python给证件照换底色(蓝底 <
-;
红底-;
白底)相关的知识,希望能为你提供帮助。
在我们的生活中常常要用到各种底色要求的证件电子照,红底、蓝底、或者白底,而假如你手上只有一种底色的证件照,你又不想再去拍又不会PS怎么办?今天教你们用OpenCV和python给你的证件照换底色。
文章图片
- Python3
- numpy函数库
- OpenCV库
- Windows10 + Anaconda+Pycharm
文章图片
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)
红底变蓝底
文章图片
蓝底变红底
文章图片
变白底
文章图片
完整代码在后台回复关键字:证件照,即可下载使用。 扫描二维码
获取更多精彩
码农的后花园
文章图片
【教你用OpenCV 和 Python给证件照换底色(蓝底 < -; 红底-; 白底)】
推荐阅读
- Python高级用法总结-字典排序
- 0元学Scratch趣味编程第二课(绘制等边三角形(附送8例Scratch基础编程带注释源代码))
- 眼见为实,看看MySQL中的隐藏列!
- nginx端口转发&负载均衡
- 听说原型是UI的工作,我要暴走了…
- 如何优雅地实现分页查询
- rf安装之rf应用
- 万字干货OpenMetric与时序数据库存储模型分析
- 数字化的终局(赛博朋克(社会主义?))