网上交证件照的时候不同单位对底色的要求不一样,当你手里只有一张蓝底照片,却要求交红底或者白底的证件照时,不免就尴尬了些。此时的你为了避免重拍的麻烦,不得不打开ps一点一点地去抠图换背景,费时费力。
opencv
今天就给大家介绍一下python利用opencv库进行蓝底换红底或者白底照片的操作。
1.强大的opencv库
说到图像处理,不得不提opencv库。它是一个跨平台的计算机视觉库,可以运行在不同操作系统上,它由一些列c函数和少量c++函数组成,并提供python,matlab等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。
我们这里用的opencv-python 就是opencv的python API接口。
重点来袭
本文中主要用到的方法进行介绍:
cv2.imread(picpath):该函数功能为读入图像cv2.cvtColor():色彩转换函数,因为在图像处理的时候,有些图像可能在RGB颜色空间信息不如转换到其它颜色空间更清晰。cv2.inRange(hsv, lower_red, upper_red):该函数主要设阈值,去背景。第一个参数hsv为原图像;第二个参数指图像中低于这个lower_red的值,图像值变为0;第三个参数指图像中高于这个upper_red的值,图像值变为0。cv2.erode():图像腐蚀处理,可以使图像的色彩更加突出,减少不必要颜色的干扰,也就是消除白噪声。cv2.dilate():图像膨胀处理,腐蚀会消除白噪声,但也会缩小图片中的物体,所以需要用膨胀处理。2.实现照片换底
1.读取原始图片,并对图片缩放。
第一步
之所以进行缩放是因为对图片缩放可以增强它的平滑度和清晰度。
2.RGB空间转为HSV空间
第二步
因为RGB通道不能很好反应出物体的具体颜色信息,而HSV空间能够非常直观的表达色彩的明暗,色调,以及鲜艳程度,方便进行颜色之间的对比。
设置lower_blue,低于这个值图像值变为0,即为黑色。设置upper_blue,高于这个值图像值变为0,即为黑色。
inRange函数处理后的mask
再通过inRange函数将蓝色与人的头像色比对出来,将蓝色区域变成白色,其它区域为黑。处理的效果如图
3.腐蚀膨胀
第三步
腐蚀对图像的白噪声进行消除,随之带来的后果是使图像中的物体缩小,所以再进行膨胀操作,放大物体。这两个操作一般都是成对出现。
4.遍历替换颜色
遍历每一个像素的值,如果发现是白色(即原照片的蓝色区域)就将其变为红色
遍历替换
这样变换出来的图片就为红底的。原图与现图对比:
图片对比
这里实现了蓝底变红底,要是实现变白底,只需要让第四步的遍历替换中的代码
img[i, j] = (0, 0, 255)变为img[i, j] = (255, 255, 255)即可,感兴趣的小伙伴快来试试吧。
要是分享的功能小伙伴觉得有用,可以点赞收藏一下,以后说不准就用到了!代码可以留言获取哦!
谢谢大家
另外可以关注我,会分享好多办公中省时省力简单的代码哦!欢迎留言讨论。转载请注明出处(百家号:戏说编程)