基于OpenCV python3实现证件照换背景的方法

作者:ahaofan 时间:2023-01-30 06:25:54 

简述

生活中经常要用到各种要求的证件照电子版,红底,蓝底,白底等,大部分情况我们只有其中一种,所以通过技术手段进行合成,用ps处理证件照,由于技术不到位,有瑕疵,所以想用python&openCV通过代码的方式实现背景颜色替换,加强一下对于openCV的学习,锻炼一下编码水平。

软件环境:

python3.5
opencv2
windows 10

图像载入

导入opencv库,使用imread函数读取图片


import cv2
import numpy as np

img=cv2.imread('zjz.jpg')

由于证件照太大,不方便显示,故进行缩放


#缩放
rows,cols,channels = img.shape
img=cv2.resize(img,None,fx=0.5,fy=0.5)
rows,cols,channels = img.shape
cv2.imshow('img',img)

原图如下

基于OpenCV python3实现证件照换背景的方法
(图片源于网络,已经马赛克处理,如有侵权,私信立即删除)

获取背景区域

首先将读取的图像默认BGR格式转换为HSV格式,然后通过inRange函数获取背景的mask。
HSV颜色范围参数可调节根据这篇文章


hsv=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
lower_blue=np.array([78,43,46])
upper_blue=np.array([110,255,255])
mask = cv2.inRange(hsv, lower_blue, upper_blue)
cv2.imshow('Mask', mask)

获得的mask如下图

基于OpenCV python3实现证件照换背景的方法 

如图所示蓝色的背景在图中用白色表示,白色区域就是要替换的部分,但是黑色区域内有白点干扰,所以进一步优化。
腐蚀和膨胀


#腐蚀膨胀
erode=cv2.erode(mask,None,iterations=1)
cv2.imshow('erode',erode)
dilate=cv2.dilate(erode,None,iterations=1)
cv2.imshow('dilate',dilate)

经过腐蚀和膨胀操作后如下图

基于OpenCV python3实现证件照换背景的方法 

处理后图像单独白色点消失。

替换背景色

遍历全部像素点,如果该颜色为dilate里面为白色(255)则说明该点所在背景区域,于是在原图img中进行颜色替换。


#遍历替换
for i in range(rows):
for j in range(cols):
 if dilate[i,j]==255:
  img[i,j]=(0,0,255)#此处替换颜色,为BGR通道
cv2.imshow('res',img)

最终结果如下

基于OpenCV python3实现证件照换背景的方法
(图片源于网络,已经马赛克处理,如有侵权,私信立即删除)

总结

最开始想直接通过遍历全图进行替换背景色,但是图像中难免有些像素点和背景色一样,造成了干扰,导致最后结果不尽人意,所以想通过这种方法进行处理。显然最后有明显的ps痕迹。

最后贴上完整代码,不足之处欢迎各位指正!


import cv2
import numpy as np

img=cv2.imread('zjz.jpg')
#缩放
rows,cols,channels = img.shape
img=cv2.resize(img,None,fx=0.5,fy=0.5)
rows,cols,channels = img.shape
cv2.imshow('img',img)

#转换hsv
hsv=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
lower_blue=np.array([78,43,46])
upper_blue=np.array([110,255,255])
mask = cv2.inRange(hsv, lower_blue, upper_blue)
cv2.imshow('Mask', mask)

#腐蚀膨胀
erode=cv2.erode(mask,None,iterations=1)
cv2.imshow('erode',erode)
dilate=cv2.dilate(erode,None,iterations=1)
cv2.imshow('dilate',dilate)

#遍历替换
for i in range(rows):
for j in range(cols):
 if dilate[i,j]==255:
  img[i,j]=(0,0,255)#此处替换颜色,为BGR通道
cv2.imshow('res',img)

cv2.waitKey(0)
cv2.destroyAllWindows()

来源:https://blog.csdn.net/haofan_/article/details/76618362

标签:python3,OpenCV,证件照
0
投稿

猜你喜欢

  • 全面理解JavaScript中的闭包

    2024-04-17 10:09:24
  • keras.utils.to_categorical和one hot格式解析

    2023-10-03 18:27:12
  • php快递单号查询接口使用示例

    2023-10-25 07:39:55
  • 算法系列15天速成 第十四天 图【上】

    2023-02-09 22:30:25
  • keras CNN卷积核可视化,热度图教程

    2021-03-15 05:06:15
  • Python3操作YAML文件格式方法解析

    2021-05-22 03:57:10
  • 对django xadmin自定义菜单的实例详解

    2023-06-19 22:48:21
  • PHP魔术方法__ISSET、__UNSET使用实例

    2024-05-22 10:09:08
  • asp.net 多数据库支持的思考

    2024-01-16 04:50:45
  • JS与Ajax Get和Post在使用上的区别实例详解

    2024-04-23 09:07:40
  • Python流行ORM框架sqlalchemy安装与使用教程

    2022-10-20 06:12:20
  • 用js格式化金额可设置保留的小数位数

    2024-05-21 10:20:44
  • explain命令为什么可能会修改MySQL数据

    2024-01-19 14:53:49
  • Python开发网站目录扫描器的实现

    2022-07-09 11:51:02
  • Django框架配置mysql数据库实现过程

    2024-01-20 00:35:23
  • javascript的var与let,const之间的区别详解

    2024-05-09 15:06:41
  • 一个基于ROW_NUMBER()的通用分页存储过程代码

    2024-01-18 13:55:09
  • 利用pyuic5将ui文件转换为py文件的方法

    2023-03-20 05:01:43
  • 解决Pymongo insert时会自动添加_id的问题

    2021-07-21 04:13:24
  • python协程之yield和yield from实例详解

    2022-10-31 05:47:42
  • asp之家 网络编程 m.aspxhome.com