查看原文
其他

OpenCV库——轻松更换证件照背景色

爬虫俱乐部 Stata and Python数据分析 2022-03-15

本文作者:寇晓璇,中南财经政法大学统计与数学学院

本文编辑:张孟晗

技术总编:陈   鼎

Stata&Python云端课程来啦!

为了感谢大家长久以来的支持和信任,爬虫俱乐部为大家送福利啦!!!Stata&Python特惠课程双双上线腾讯课堂~原价2400元的Python编程培训课程,现在仅需100元,详情请查看推文《Python云端课程福利大放送!0基础也能学~》。关于Stata,爬虫俱乐部推出了系列课程,内容包括字符串函数、正则表达式、爬虫专题和文本分析,可以随心搭配,价格美丽,物超所值,更多信息可查看Stata系列推文《与春天有个约会,爬虫俱乐部重磅推出正则表达式网络课程!》《与春天有个约会,爬虫俱乐部重磅推出基本字符串函数网络课程》等。变的是价格,不变的是课程质量和答疑服务。对报名有任何疑问欢迎在公众号后台和腾讯课堂留言哦


导读
一般情况下,我们习惯使用Photoshop来更换证件照背景色,同样地,Python通过结合`OpenCV``Numpy`库也可以快速实现证件照换底,方法更加简单、快捷。本文将以蓝底照片为例,将其底色转换为红色,大家看懂代码后也可以自行修改其他颜色的背景。
1、前期准备
首先,准备好所需的`numpy`和`cv2`模块,安装命令如下:
pip install numpypip install opencv-python

注:`cv2`模块的安装命令与以往略有不同,需输入`opencv-python`进行安装。


2、读取图片
准备好自己想要转换的图片`image1.jpg`,并读取它。

# 导入相关库import cv2import numpy as np
# 读取图片img = cv2.imread('image1.jpg')   #' '内输入图片路径

导入的原始图片


3、图像缩放、提取像素点
将原图片进行缩放,并分别提取像素点的行和列。
img = cv2.resize(img,None,fx=0.9,fy=0.9) #resize()图片缩放,其中fx和fy表示缩放比例rows,cols,channels = img.shapeprint(rows,cols,channels)


4、将图片转换为灰度图
三色图片有`RGB`三个颜色通道,无法进行腐蚀、膨胀操作。这时便需要我们将彩色图片转换为`hsv`灰度图像后,再完成腐蚀和膨胀的操作。下述命令可以将彩色图片转化为`hsv`灰度图。
hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)


5、将图片进行二值化处理
二值化处理是为了将彩色图片转换为黑白图片。同时,对于图像的处理我们也需要自定义一个最小值、最大值,这里分别用`lower_blue``upper_blue`表示。
lower_blue = np.array([90,70,70])upper_blue = np.array([110,255,255])mask = cv2.inRange(hsv, lower_blue, upper_blue) #蓝色范围内变白,其余之外全部变黑


6、图片的腐蚀和膨胀
图片的二值化处理,可能会出现噪声(白点),有的图片显示的很明显,这就需要我们进行腐蚀或膨胀。我们可以采用腐蚀或膨胀进行图片的处理,观察哪种去除噪声的效果好一些。
erode=cv2.erode(mask,None,iterations=1) #进行腐蚀操作dilate=cv2.dilate(mask,None,iterations=1)  #进行膨胀操作


7、遍历每个像素点进行颜色替换
图片是由一个一个像素点组成的,我们的目的便是找到腐蚀后白色底色处的像素点,然后将原图中对应位置处的像素点,替换为红色。
#遍历每个像素点,进行颜色的替换for i in range(rows): for j in range(cols): if dilate[i,j]==255: # 像素点为255表示的是白色,此处将白色处的像素点替换为红色(将if dilate[i,j]==255中的dilate换成erode对比试试) img[i,j]=(0,0,255) # 此行将蓝底替换成红底,即(0,0,255)代表红色,由于历史原因,为BGR(蓝绿红)通道,不是RGB(红绿蓝)通道,所以255放第三个位置


8、显示并保存图片
 分别使用`imshow``imwrite`显示、保存图片。
# 显示图片cv2.imshow('img',img) # ' '内填写路径# 保存图片cv2.imwrite('image2.jpg',img,[int(cv2.IMWRITE_JPEG_QUALITY),100])

转换后的图片



完整代码
import cv2import numpy as np# 读取并显示图片img=cv2.imread('image1.jpg')
# 图像缩放img = cv2.resize(img,None,fx=0.9,fy=0.9)rows,cols,channels = img.shapeprint(rows,cols,channels)
# 图片转换为灰度图hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
# 图片的二值化处理,可能会出现噪声(白点),有的图片显示的很明显,这就需要我们进行腐蚀或膨胀。lower_blue = np.array([90,70,70])upper_blue = np.array([110,255,255])mask = cv2.inRange(hsv, lower_blue, upper_blue) #蓝色范围内变白,其余之外全部变黑
#腐蚀膨胀,主要用于去处噪声erode=cv2.erode(mask,None,iterations=1) #进行腐蚀操作dilate=cv2.dilate(mask,None,iterations=1) #进行膨胀操作
#遍历每个像素点,进行颜色的替换for i in range(rows): for j in range(cols): if dilate[i,j]==255: # 像素点为255表示的是白色,此处将白色处的像素点替换为红色(将if dilate[i,j]==255中的dilate换成erode对比试试) img[i,j]=(0,0,255) # 此行将蓝底替换成红底,即(0,0,255)代表红色,由于历史原因,为BGR(蓝绿红)通道,不是RGB(红绿蓝)通道,所以255放第三个位置
# 显示图片cv2.imshow('img',img)
#设置窗口等待,如果不设置,窗口会一闪而过cv2.waitKey(0)
#保存图片cv2.imwrite('image2.jpg',img,[int(cv2.IMWRITE_JPEG_QUALITY),100])



大家只需将图片的路径进行替换,便可快速得到换底后的照片了。万变不离其宗,红底变蓝底、蓝底变白底,大家也可以着手去试试。

最后,我们为大家揭秘雪球网(https://xueqiu.com/)最新所展示的沪深证券和港股关注人数增长Top10。



欢迎大家点赞、转发、评论哦!

对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!

往期推文推荐 

         800万年薪!还有谁?!

        千古伤心词人,词伤几何?

去哪儿网攻略爬取——跟我一起去大理吧

"有你才有团"——Stata爬取王者荣耀英雄海报

  爬虫实战|嚣张的徽州宴老板娘错在哪?

如何获取衡量股民情绪的指标?|东方财富股吧标题爬虫

利用Python构建马科维茨有效边界

rangestat,让统计量灵活滚动起来!

听说这样做立项成功率更高哦

如何处理缺失值?这一篇搞定!

  善用dataex命令,高效沟通你我他

  用Markdown制作简历,强力助力你的求职季

大数据下的大学分数线排行榜,快来围观!

《觉醒年代》—带你回到百年前

用Stata画的三维图很奇怪怎么办?

如何随机生成满足特定数据特征的新变量?

爬取无法翻页网页——自然科学基金项目及可视化

爬取京东评论数据进行情感分类

Stata与音乐之间的酷炫连接

这些年,爬虫俱乐部走出的博士们!
         看这里,近五年各校高被引论文上榜名单!

高校经管类核心期刊发文排行榜

疯狂的科研创新加速器——Stata!

  可盐可甜,“粽”有所爱,快来pick你最爱的粽子吧!

  好玩有趣的手绘图形库——cutecharts

  爬虫实战|摩尔庄园微博话题讨论

  一季度财报出炉,哪些公司最烧钱?

  一季度财报出炉,哪些公司最赚钱?

  技能篇 | 图片合并大法

  批量空气质量数据文件合并分析

关于我们 


微信公众号“Stata and Python数据分析”分享实用的Stata、Python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。



此外,欢迎大家踊跃投稿,介绍一些关于Stata和Python的数据处理和分析技巧。

投稿邮箱:statatraining@163.com投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存