计算机视觉 --基于opencv实现证件照换底色、翻转
1. 原因
在实际工作生活中,需要根据各种要求,提供不同底色的证件照电子版。常见的证照件底色有红底,蓝底,白底。
但我们在大部分情况只有其中一种底色的照片,就需要通过技术手段实现证件照换底色。但因为PS技术不到位,有瑕疵,通常处理的效果不理想。
本文基于opencv-python, 通过代码的方式实现y证件照底色的替换,同时针对相关的函数如图片缩放、翻转的使用方式进行学习。
2.图片来源及换底效果展示
2.1 图片来源说明
该图片来源于百度图片,如果侵权,请联系我删除!图片仅用于知识交流学习。
2.2 换底及翻转效果展示
将证件照的底色从蓝底换成白底,下面展示了图片的左右翻转
3. 源代码及相关知识介绍
3.1 相关知识介绍
3.1.1 cvtColor 颜色空间转换函数
cvtColor函数的定义是: def cvtColor(src, code, dst=None, dstCn=None): 用于将图片的颜色空间进行转换
注意: cv2.imread读取图片,是按BGR颜色空间读取的,不是最常见的RGB格式 ,在进行证件照底色变换时,需要将图片的颜色空间转换为HSV
即hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
3.1.2 inRange
inRange函数的定义是: def inRange(src, lowerb, upperb, dst=None):, 用于将图片中介于 lower/upper 之间的为变为白色,其余的变为黑色,效果如下:
函数参数说明:
- 第一个参数:src指的是原图
- 第二个参数:lowerb指的是图像中低于这个 lower_red 的值,图像值变为 0
- 第三个参数:upperb指的是图像中高于这个 upper_red 的值,图像值变为 0
- 第四个参数:dst 指输出,一般不指定。
注意: 在 lower_red~upper_red 之间的值变成 255, 注意:不同的证件照底色,inRange的lowerb,upperb需要根据HSV色彩空间表进行设置
3.1.3 HSV颜色模型
HSV(Hue, Saturation, Value)是根据颜色的直观特性由A. R. Smith在1978年创建的一种颜色空间, 也称六角锥体模型(Hexcone Model)。
是将RGB色彩空间中的点在倒圆锥体中的表示方法,HSV即:色调(H),饱和度(S),明度(V)
色调H
用角度度量,取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。它们的补色是:黄色为60°,青色为180°,紫色为300°;
明度表示颜色明亮的程度,对于光源色,明度值与发光体的光亮度有关;对于物体色,此值和物体的透射比或反射比有关。通常取值范围为0%(黑)到100%(白)。
圆锥的顶点处,V=0,H和S无定义,代表黑色。圆锥的顶面中心处V=max,S=0,H无定义,代表白色。见下图:
HSV色彩空间表: 在源代码中基于HSV色彩空间表的数据,放在colorLowerB、colorUpperB,用于根据指定的颜色,产生inRange函数的lowerb,upperb参数
详见请参见:OpenCV学习笔记——HSV颜色空间超极详解&inRange函数用法及实战
3.2 源代码
import cv2
import numpy as np
from PIL import ImageFontclass ImageProcess:# 用于产生图片的mask遮罩,在cv2.inRange中使用, 效果是将证件底的底色变白色colorLowerB = {'red': np.array([156, 43, 46]),'orange': np.array([11, 43, 46]),'yellow': np.array([26, 43, 46]),'green': np.array([35, 43, 46]),'cyan': np.array([78, 43, 46]),'blue': np.array([100, 43, 46]),'purple': np.array([125, 43, 46]),'black': np.array([0, 0, 0]),'gray': np.array([0, 0, 46]),'white': np.array([0, 0, 221]),}colorUpperB = {'red': np.array([180, 255, 255]),'orange': np.array([25, 255, 255]),'yellow': np.array([34, 255, 255]),'green': np.array([77, 255, 255]),'cyan': np.array([99, 255, 255]),'blue': np.array([124, 255, 255]),'purple': np.array([155, 255, 255]),'black': np.array([180, 255, 46]),'gray': np.array([180, 43, 220]),'white': np.array([180, 30, 255]),}# BGR通道destColor = {'red': (0, 0, 255),'orange': (0, 165, 255),'yellow': (0, 255, 255),'green': (0, 128, 0),'blue': (255, 0, 0),'cyan': (255, 255, 0),'purple': (128, 0, 128),'black': (0, 0, 0),'gray': (128, 128, 128),'white': (255, 255, 255),}def __init__(self, scale=1):self.scale = scaledef changeBackground(self, img, originColor='white', changeColor='blue'):originImg = self.copyImg(img)rows, cols, channels = img.shape# 图片转换为灰度图hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)# 图片的二值化处理lowerB = ImageProcess.colorLowerB.get(originColor)upperB = ImageProcess.colorUpperB.get(originColor)mask = cv2.inRange(hsv, lowerB, upperB)# 针对图片进行腐蚀膨胀kernel = np.ones((3, 3), np.uint8)# kernel = Noneerode = cv2.erode(mask, kernel, iterations=1)dilate = cv2.dilate(erode, kernel, iterations=1)# 遍历每个像素点,进行颜色的替换print(type(ImageProcess.destColor))tmpColor = ImageProcess.destColor.get(changeColor)print(tmpColor)for i in range(rows):for j in range(cols):if dilate[i, j] == 255: # 像素点为255表示的是白色,我们就是要将白色处的像素点,替换为红色img[i, j] = tmpColor # 此处替换颜色,为BGR通道,不是RGB通道return imgdef copyImg(self, img):'''复制图像:param img::return:'''return cv2.cvtColor(img, cv2.NORMAL_CLONE)def flipImg(self, img):'''翻转图像:param img::return:'''rows, cols = img.shape[:2]mapx = np.zeros(img.shape[:2], np.float32)mapy = np.zeros(img.shape[:2], np.float32)for i in range(rows):for j in range(cols):mapx.itemset((i, j), cols - 1 - j)mapy.itemset((i, j), i)return cv2.remap(img, mapx, mapy, cv2.INTER_LINEAR)def showMultiPics(self, imgArray):rows = len(imgArray)cols = len(imgArray[0])# 第一张图片的宽高width = imgArray[0][0].shape[1]height = imgArray[0][0].shape[0]for x in range(0, rows):for y in range(0, cols):# 遍历,如果是第一幅图像if imgArray[x][y].shape[:2] == imgArray[0][0].shape[:2]:imgArray[x][y] = cv2.resize(imgArray[x][y], (0, 0), None, self.scale, self.scale)# 将其他矩阵变换为与第一幅图像相同大小,缩放比例为scaleelse:imgArray[x][y] = cv2.resize(imgArray[x][y],(width, height), None, self.scale,self.scale)# 如果图像是灰度图,将其转换成彩色显示if len(imgArray[x][y].shape) == 2:imgArray[x][y] = cv2.cvtColor(imgArray[x][y], cv2.COLOR_GRAY2BGR)# 创建一个空白画布,与第一张图片大小相同imgBlank = np.zeros((height, width, 3), np.uint8)hor = [imgBlank] * rowsfor x in range(0, rows):# 将元组里第x个列表水平排列hor[x] = np.hstack(imgArray[x])ver = np.vstack(hor) # 将不同列表垂直拼接return verif __name__ == '__main__':imageProcess = ImageProcess()img1 = cv2.imread('zjz1.jpg')img2 = cv2.imread('zjz1.jpg')#缩放图片img1 = cv2.resize(img1, None, fx=0.5, fy=0.5)img2 = cv2.resize(img1, None, fx=0.5, fy=0.5)originImg1 = imageProcess.copyImg(img1)originImg2 = imageProcess.copyImg(img2)flipImg = imageProcess.flipImg(img2)changeImg = imageProcess.changeBackground(img1, 'blue', 'white')font = cv2.FONT_HERSHEY_SIMPLEXcv2.putText(originImg1, 'origin-pic', (0, 15), font, 0.5, (0, 0, 0), 1)cv2.putText(originImg2, 'origin-pic', (0, 15), font, 0.5, (0, 0, 0), 1)cv2.putText(flipImg, 'pic flip', (0, 15), font, 0.5, (0, 0, 0), 1)cv2.putText(changeImg, 'pic change background color', (0, 15), font, 0.5, (0, 0, 0), 1)cv2.imshow("show multi pics", imageProcess.showMultiPics(([originImg1, changeImg], [originImg2, flipImg])))# 窗口等待的命令,0表示无限等待cv2.waitKey(0)cv2.destroyAllWindows()
3.3 代码存在的问题
如果证件照的底色在人脸,头发或衣服等区域存在,则这些地方也会被换颜色,造成效果不好。
计算机视觉 --基于opencv实现证件照换底色、翻转相关推荐
- python opencv给证件照换底色
昨天朋友忙要把白色背景的证件照换为红色的,比较急用,本人也不太会用PS,网上的那些转换小工具都是要收费的,就想着自己搞一搞,原理很简单,白色背景的像素值为[255,255,255],用这个信息生成ma ...
- 2020-11-06 Python OpenCV给证件照换底色
投简历.找工作这些事都需要证件照,有些还要求证件照背景颜色.尺寸大小,本文分享一下如果通过Python OpenCV来实现照片裁剪和更换背景色 1.读取照片 import cv2import nump ...
- 教你用OpenCV 和 Python给证件照换底色(蓝底 -红底-白底)
在我们的生活中常常要用到各种底色要求的证件电子照,红底.蓝底.或者白底,而假如你手上只有一种底色的证件照,你又不想再去拍又不会PS怎么办?今天教你们用OpenCV和Python给你的证件照换底色. P ...
- 教你用OpenCV 和 Python给证件照换底色(蓝底 <->红底->白底)
在我们的生活中常常要用到各种底色要求的证件电子照,红底.蓝底.或者白底,而假如你手上只有一种底色的证件照,你又不想再去拍又不会PS怎么办?今天教你们用OpenCV和Python给你的证件照换底色. P ...
- python怎么改成白底_教你用OpenCV 和 Python给证件照换底色(蓝底 -红底-白底)...
在我们的生活中常常要用到各种底色要求的证件电子照,红底.蓝底.或者白底,而假如你手上只有一种底色的证件照,你又不想再去拍又不会PS怎么办?今天教你们用OpenCV和Python给你的证件照换底色.P ...
- 基于python的证件照_20行代码教你用python给证件照换底色的方法示例
1.图片来源 该图片来源于百度图片,如果侵权,请联系我删除!图片仅用于知识交流. 2.读取图片并显示 imread():读取图片: imshow():展示图片: waitkey():设置窗口等待,如果 ...
- 用Excle给自己的证件照换底色(蓝底一键换红底),超级简单
用Excle给自己的证件照换底色(蓝底一键换红底),超级简单 目录 用Excle给自己的证件照换底色(蓝底一键换红底) 1. 像这样的照片底色换色,是如何操作的? 2.鼠标双击选中照片点击[重新着色] ...
- python换照片底色_Python 利用OpenCV给照片换底色的示例代码
OpenCV的全称是:Open Source Computer Vision Library.OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux.Windows和M ...
- OpenCV实现照片换底色处理
目录 1.导言 2.引言 3.代码分析 4.优化改进 5.总结 1.导言 在图像处理领域,OpenCV是一款强大而广泛应用的开源库,能够提供丰富的图像处理和计算机视觉功能.本篇博客将介绍如何利用Qt ...
- 原来 Excel 只需三步就可以给证件照换底色!
作者 | 黄伟呢 来源 | 数据分析与统计学之美(ID:gh_21c25c7e71d0) 头图 | CSDN 下载自东方IC Python完成证件照换底色 该图片来源于百度图片,如果侵权,请联系我删 ...
最新文章
- Eclipse下git如何创建分支
- WordPress中.user.ini 权限问题
- android manifest简介
- 11月25日struts培训日记
- SQL进阶,子查询与窗口函数
- 如何设计销售CRM×运营CRM×社交化SCRM系统?(一)
- 上网时间监控软件_电脑监控系统软件有哪些作用?主要功能有哪些?
- (34)Verilog HDL算术运算:加减乘除运算
- TOJ 2353: Billiard
- kali linux 桌面消失_Kali Linux添加桌面快捷方式
- Silverlight 2.“.NET研究”5D RPG游戏技巧与特效处理:(二)纸娃娃系统
- L298N和TB6612FNG模块控制直流电机
- html渐变做一个彩虹,ps渐变工具:制作七色彩虹特效
- android 手机处理器,安卓手机处理器性能排行 你的手机能排第几?
- Vue中minxis的使用
- 正多边形和多面体的对称群
- Redis设置登录密码
- 数据治理:数据治理之道-数据文化-数据思维融入企业文化
- GEE实现图像随机森林分类
- 毕业设计论文选题系统系统用例图_毕业设计管理系统UML
热门文章
- 2021 软考 软件设计师考试教程(详细版)
- 历年系统架构师论文题目总结(2012-2018)
- General Mission Analysis Tool (GMAT)学习
- 复旦大学数学学院高等代数历届期中考试大题精选之一(08级--12级)
- 线性代数核心思想及应用——行列式习题集(附详解)
- 【Python函数优化】
- ikbc机械键盘打字出现重复_入手第一把机械键盘,打字打到上瘾——ikbc 新Poker键盘 体验...
- 基于javaweb+jsp的超市便利店管理系统(JavaWeb JSP MySQL Servlet SSM SpringBoot Bootstrap Ajax)
- 计算机代码坑人小程序bat,运用bat写的整人小程序有哪些?
- JDK6升级JDK8踩雷