在我们的生活中常常要用到各种底色要求的证件电子照,红底、蓝底、或者白底,而假如你手上只有一种底色的证件照,你又不想再去拍又不会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)

红底变蓝底

蓝底变红底

变白底

完整代码,关注下面回复:证件照,下载使用。

更多有关python、深度学习和计算机编程和电脑知识的精彩内容,可以关注微信公众号:码农的后花园

教你用OpenCV 和 Python给证件照换底色(蓝底 <->红底->白底)的更多相关文章

  1. 20行代码教你用python给证件照换底色

    1.图片来源 该图片来源于百度图片,如果侵权,请联系我删除!图片仅用于知识交流.本文只是为了告诉大家:python其实有很多黑科技(牛逼的库),我们既可以用python处理工作中的一些事儿,同时我们也 ...

  2. Python给照片换底色(蓝底换红底)

    环境要求 Python3 numpy函数库 opencv库 安装 下载适应版本的numpy函数库,我电脑是WIN10 64位,安装的函数库是 numpy-1.13.1+mkl-cp36-cp36m-w ...

  3. c#实现超实用的<证件照换底色>小工具

    1前言     我们在工作和生活中经常要填写一些个人资料,这时候往往需要放证件照上去,但是有时候人家要求是红底或白底,但是偏偏不巧的是你以前照了张蓝底的.这时候你想换个底色,于是在百度上一搜“证件照换 ...

  4. 今天抠图,Python实现一键换底片!想换什么换什么(附源码)

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 生活中我们会拍很多的证件照,有的要求红底,有的是白底,有的是蓝底,今天不通 ...

  5. Photoshop教您快速的制作标准一寸证件照教程

    Photoshop教您快速的制作标准一寸证件照教程 对急需证件照的朋友,只要有一部相机,有电脑安装了PS软件,就可很快自己完成一寸照片的制作. 首先将相机卡里的照片存放在电脑硬盘里: 打开PS图片处理 ...

  6. 【转载】教你分分钟学会用python爬虫框架Scrapy爬取心目中的女神

    原文:教你分分钟学会用python爬虫框架Scrapy爬取心目中的女神 本博文将带领你从入门到精通爬虫框架Scrapy,最终具备爬取任何网页的数据的能力.本文以校花网为例进行爬取,校花网:http:/ ...

  7. (原)windows8.1上使用opencv for python

    转载请注明出处: http://www.cnblogs.com/darkknightzh/p/6204100.html 参考网址: http://www.docs.opencv.org/master/ ...

  8. OpenCV之Python学习笔记

    OpenCV之Python学习笔记 直都在用Python+OpenCV做一些算法的原型.本来想留下发布一些文章的,可是整理一下就有点无奈了,都是写零散不成系统的小片段.现在看 到一本国外的新书< ...

  9. Ubuntu16.04安装opencv for python/c++

    Ubuntu16.04安装opencv for python/c++ 网上关于opencv的安装已经有了不少资料,但是没有一篇资料能让我一次性安装成功,因此花费了大量时间去解决各种意外,希望这篇能给一 ...

随机推荐

  1. 最全总结!聊聊 Python 调用 JS 的几种方式

    1. 前言 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做案例的人,却不知道如何去学习更加高深的知识.那么针对这三类人,我给大 ...

  2. C#LeetCode刷题之#383-赎金信(Ransom Note)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3937 访问. 给定一个赎金信 (ransom) 字符串和一个杂志 ...

  3. C#LeetCode刷题之#66-加一(Plus One)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3684 访问. 给定一个由整数组成的非空数组所表示的非负整数,在该 ...

  4. C#LeetCode刷题之#575-分糖果​​​​​​​(Distribute Candies)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3798 访问. 给定一个偶数长度的数组,其中不同的数字代表着不同种 ...

  5. speedtest测速网站测速节点添加流程

    一.准备一台服务器: 系统需求:常见Linux系统: 二.服务器入网(确保可以访问互联网): 三.ssh登录到服务器安装speedtest守护程序程序包: 安装和启动,执行以下命令: curl -O ...

  6. 解决@ResponseBody不能和 <mvc:annotation-driven>同时使用的问题

    我们都知道使用Springmvc的ajax很强大只要三步就可以实现: 1.引入jackson的maven到pom文件: <dependency> <groupId>com.fa ...

  7. stat 命令家族(3)- 详解 mpstat

    性能测试必备的 Linux 命令系列,可以看下面链接的文章哦 https://www.cnblogs.com/poloyy/category/1819490.html 介绍 输出 CPU 相关信息 m ...

  8. 下载的附件名总乱码?你该去读一下 RFC 文档了!

    纸上得来终觉浅,绝知此事要躬行 Web 开发过程中,相信大家都遇到过附件下载的场景,其中,各浏览器下载后的文件名中文乱码问题或许一度让你苦恼不已. 网上搜索一下,大部分都是通过Request Head ...

  9. hdfs学习(一)

    一.hdfs概述 介绍: 在现代的企业环境中,单机容量往往无法存储大量数据,需要跨机器存储.统一管理分布在集群上的文件系统称为分布式文件系统 .HDFS(Hadoop Distributed File ...

  10. JavaSwing关于GridBagLayout(网格袋布局)的使用

    下面的链接有初步的介绍: https://blog.csdn.net/xietansheng/article/details/72814552 关于GridBagConstraints: GridBa ...