经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Python3 » 查看文章
基于OpenCV python3实现证件照换背景的方法
来源:jb51  时间:2019/3/22 10:43:10  对本文有异议

简述

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

软件环境:

python3.5
opencv2
windows 10

图像载入

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

  1. import cv2
  2. import numpy as np
  3.  
  4. img=cv2.imread('zjz.jpg')

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

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

原图如下


(图片源于网络,已经马赛克处理,如有侵权,私信立即删除)

获取背景区域

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

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

获得的mask如下图

 

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

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

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

 

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

替换背景色

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

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

最终结果如下


(图片源于网络,已经马赛克处理,如有侵权,私信立即删除)

总结

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

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

  1. import cv2
  2. import numpy as np
  3.  
  4. img=cv2.imread('zjz.jpg')
  5. #缩放
  6. rows,cols,channels = img.shape
  7. img=cv2.resize(img,None,fx=0.5,fy=0.5)
  8. rows,cols,channels = img.shape
  9. cv2.imshow('img',img)
  10.  
  11. #转换hsv
  12. hsv=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
  13. lower_blue=np.array([78,43,46])
  14. upper_blue=np.array([110,255,255])
  15. mask = cv2.inRange(hsv, lower_blue, upper_blue)
  16. cv2.imshow('Mask', mask)
  17.  
  18. #腐蚀膨胀
  19. erode=cv2.erode(mask,None,iterations=1)
  20. cv2.imshow('erode',erode)
  21. dilate=cv2.dilate(erode,None,iterations=1)
  22. cv2.imshow('dilate',dilate)
  23.  
  24. #遍历替换
  25. for i in range(rows):
  26. for j in range(cols):
  27. if dilate[i,j]==255:
  28. img[i,j]=(0,0,255)#此处替换颜色,为BGR通道
  29. cv2.imshow('res',img)
  30.  
  31. cv2.waitKey(0)
  32. cv2.destroyAllWindows()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持w3xue。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号