【Python】一键抠图,3行代码实现照片/证件照换背景色

前言:

今天上课,老师刚好说到了这个,证件照换底色之前也写过,但老师说他用的很厉害的Pyhon新的库,就想再回顾一下,顺便梳理一下流程和所用知识点。

对于不会PS的小伙伴,抠图是一个难度系数想当高的活,某宝照片抠图和证件照换底色价格都是几元左右,那么对于程序员来说,即使不会P图,我们也可以完成自己更换

通过本篇博客,你只需要有一点Pyhon基础,便可以实现自己理解并完成整个代码。

每个代码部分下方都会有原理讲解

那么接下来,我们会分别从不同的方式来讲解Python实现照片换底色的方法,分别是:

  • 使用removebg 工具
  • 使用Python PIL/Pillow库
  • python matplotlib模块和nump模块
  • python numpy函数库opencv库

Python实现照片

removebg

官网:
https://www.remove.bg

简介:Remove Image Background(后面简称:Re­move.bg),它基于 Python、Ruby 和深度学习技术开发,通过强大的 AI 人工智能算法实现自动识别出前景主体与背景图,完成图片的背景转换

【Python】一键抠图,3行代码实现照片/证件照换背景色_第1张图片
目前提供两种方式:在线抠图和Python代码抠图

在线抠图

1登录其官网,注册登录,上传本地图片或网络图片的URL。

官网https://www.remove.bg
在其后方加上/zh可换为中文 https://www.remove.bg/zh

【Python】一键抠图,3行代码实现照片/证件照换背景色_第2张图片

2.上传成功后,平台仅需几秒钟实现自动抠图,可直接下载无背景透明的图像照片
【Python】一键抠图,3行代码实现照片/证件照换背景色_第3张图片
同时,我们还可以受用自动编辑功能,自行更换图片背景和调整滤镜,可以上传本地背景及滤镜,点击Download即可完成下载

默认为.png格式
【Python】一键抠图,3行代码实现照片/证件照换背景色_第4张图片

Python代码抠图

在正常使用开发中,我们需要使用代码完成一系列功能,而Remove Image Background网站提供了外置的API连接

点击Tools&API 目前Re­move.bg提供支持

  • Windows / Mac / Linux 平台的软件工具
  • 和基于PS外置模块
  • 还有就是网站的API

【Python】一键抠图,3行代码实现照片/证件照换背景色_第5张图片

使用API 需要注册账号方可获取密钥,默认生成的图片格式尺寸是标准的,每月最多免费处理 50 张照片,且每张尺寸大小不超过25MB,如果想生成高清或者处理更多图片需要付费(在线抠图方式没有次数限制)。
【Python】一键抠图,3行代码实现照片/证件照换背景色_第6张图片

注册Re­move.bg,之后获取你的API
【Python】一键抠图,3行代码实现照片/证件照换背景色_第7张图片

1.在CMD命令行输入

pip install removebg

使用pip方式安装removebg模块
【Python】一键抠图,3行代码实现照片/证件照换背景色_第8张图片
附录:

Python安装模块的方式,一种是使用pip来安装,这种安装方式是使用在线的仓库来安装,默认配置的是国外的Python官方库

pip来开始安装removebg模块,命令是:

pip install removebg

然后就会自动连接到对应的仓库上面去开始下载removebg模块以及各种依赖模块,解压安装。

Github地址:
https://github.com/brilam/remove-bg

import removebg 导入模块 如果没有提示错误,则表示安装成功
在这里插入图片描述

单个图片转换
from removebg import RemoveBg
rmbg = RemoveBg("Xj97qArdBxxxx, "error.log") # 引号内是你获取的API
rmbg.remove_background_from_img_file(r"‪C:\Users\48013\Pictures\Cache_4da0f4a375f31d18..jpg") #图片地址

之后点击Run运行 即可在文件夹中看到转换的无背景照片

【Python】一键抠图,3行代码实现照片/证件照换背景色_第9张图片
效果如下:
【Python】一键抠图,3行代码实现照片/证件照换背景色_第10张图片

2批量图片转换
from removebg import RemoveBg
import os
  
rmbg = RemoveBg("3Uxxxxxx", "error.log")
path = '%s/picture'%os.getcwd() #图片放到程序的同级文件夹 picture 里面
for pic in os.listdir(path):
  rmbg.remove_background_from_img_file("%s\%s"%(path,pic))

把图片放到一个文件夹就可以实现批量抠图。

功能: 实现同一文件夹内图片背景转换



3使用图片的URL进行转换:
from removebg import RemoveBg

rmbg = RemoveBg("YOUR-API-KEY", "error.log")
rmbg.remove_background_from_img_url("http://www.example.com/some_image.jpg")



  
下面我们对几个函数进行下讲解:

remove_background_from_img_file(img_file_path,size,bg_color)

该函数共有三个参数:

参数 描述
img_file_path 图像文件的路径
size 输出图像的大小(regular=0.25 MP,HD=4MP,4k=最多10 MP)。默认值为“regular”
bg_color 为图片添加纯色背景。可以是十六进制颜色代码(例如:81d4fa,FFF)或颜色名称(例如green)。

其中: MP的意思是指百万像素

MP是mega pixel的缩写。mega意为一百万,mega pixel 指意为100万像素。
10MP 表示最多到1000万像素 也就是4K

from removebg import RemoveBg

rmbg = RemoveBg("YOUR-API-KEY", "error.log")
rmbg.remove_background_from_img_file("joker.jpg",size="4k")

当然,普通用户只能使用一次高清图片,和一个月50次的regular(1/4MP)的图片

Python Pillow库

1. 什么是Pillow

PIL(Python Image Library)是python的第三方图像处理库,但是由于其强大的功能与众多的使用人数,几乎已经被认为是python官方图像处理库了。其官方主页为:PIL。 PIL历史悠久,原来是只支持python2.x的版本的,后来出现了移植到python3的库pillow,pillow号称是friendly fork for PIL,其功能和PIL差不多,但是支持python3 又加入了许多新特性,因此,我们可以直接安装使用Pillow。

1安装pillow

CMD命令行输入:

pip install pillow
原理讲解:

在读取RGB图片时,往往把图片转化为四通道图片,其中第四个通道是α通道,可以决定图像的透明度
如果把图片的前景的透明度设定为1,背景的透明度设定为0,那么就算去掉了背景了

具体点说:需要使用RGBA(Red,Green,Blue,Alpha)格式,将背景的alpha的透明度变为0,这样就可以了,

from PIL import Image
img = Image.open(r".\Cache_4da0f4a375f31d18..jpg")   #注意是当前路径
img = img.convert("RGBA")  # 转换获取信息
pixdata = img.load()
for y in range(img.size[1]):
    for x in range(img.size[0]):
        if pixdata[x, y][0] > 220 and pixdata[x, y][1] > 220 and pixdata[x, y][2] > 220 and pixdata[x, y][3] > 220:
            pixdata[x, y] = (255, 255, 255, 0)
img.save(r".\element__2__new.png"))

其实简单来说,这部分代码就是获取图片的RGB值,然后对颜色较深的背景部分,转换为alpha透明度为0 的透明色 适用于较为简单的图片 自行修改需要判断的RGB值即可

适合背景颜色单一 且区分较大的情况

我们以下方图片为例
【Python】一键抠图,3行代码实现照片/证件照换背景色_第11张图片
此为阈值为30时情况 素描图片
【Python】一键抠图,3行代码实现照片/证件照换背景色_第12张图片
这种方法肯定有一大堆的不足,对于具体的高级过程还是要去学习算法的应用,这里只是做一个简单的介绍

python matplotlib模块和nump模块

原理和上方原理相同。

这里我们贴下代码

import numpy as np
import matplotlib.image as pg
a=pg.imread('a.png')
u,v,w=a.shape
for i in range(u):
	for j in range(v):
		ifa[i,j,2]>2*a[i,j,0] and a[i,j,2]>1.5*a[i,j,1]:
			a[i,j]=np.array([0]*4)
pg.imsave('new.png',a)

numpy函数库和opencv库

安装numpy函数库
`1.打开网址https://pypi.org/project/numpy/#files,找到安装的python版本对应的numpy版本。

cp后为python版本,amd后为位数

比方说自己的是python3.5, 64位操作系统,所以选择numpy-1.11.2+mkl-cp35-cp35m-win-amd64.whl

2.将numpy下载到 python的安装目录下的scripts文件夹中

3.然后在cmd中执行以下命令

pip3.6 install D:\java\python36\Scripts\numpy-1.13.3-cp36-none-win_amd64.whl

2直接CMD输入

pip install numpy
【Python】一键抠图,3行代码实现照片/证件照换背景色_第13张图片
安装OPencv3

后面部分会单独写成一篇,讲解下OPencv的一些函数
近期会更新

大概的效果如下图:
使用PyCharm

大体过程
1进行图片压缩
2进行背景获取 BGR转HSV
3进行腐蚀膨胀滤波
4获取背景转换色
5遍历替换

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

import cv2
import numpy as np
img=cv2.imread('yay.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)

获取背景区域

首先将读取的图像默认BGR格式转换为HSV格式,然后通过inRange函数获取背景的mask。

#转换hsv
hsv=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
lower_blue=np.array([90,70,70])  #HSV颜色范围参数
 //分离HSV空间,v[0]为H色调,v[1]为S饱和度,v[2]为v灰度
upper_blue=np.array([110,255,255])
mask = cv2.inRange(hsv, lower_blue, upper_blue)
cv2.imshow('Mask', mask)

获得的mask如下图
【Python】一键抠图,3行代码实现照片/证件照换背景色_第14张图片

什么是掩膜(mask
数字图像处理中的掩膜的概念是借鉴于PCB制版的过程,在半导体制造中,许多芯片工艺步骤采用光刻技术,用于这些步骤的图形“底片”称为掩膜(也称作“掩模”),其作用是:在硅片上选定的区域中对一个不透明的图形模板遮盖,继而下面的腐蚀或扩散将只影响选定的区域以外的区域。
图像掩膜与其类似,用选定的图像、图形或物体,对处理的图像(全部或局部)进行遮挡,来控制图像处理的区域或处理过程。

1 提取感兴趣区:用预先制作的感兴趣区掩膜与待处理图像相乘,得到感兴趣区图像,感兴趣区内图像值保持不变,而区外图像值都为0;
2 屏蔽作用:用掩膜对图像上某些区域作屏蔽,使其不参加处理或不参加处理参数的计算,或仅对屏蔽区作处理或统计;
3 结构特征提取:用相似性变量或图像匹配方法检测和提取图像中与掩膜相似的结构特征;
4 特殊形状图像的制作。

简单来说:就是获取一部份区域,只对这部分区域做处理,或者只对这部分区域外的区域做处理。(在证件照中可以理解为把人像作为mask 背景作为外部处理区域)

而HSV颜色调节范围这里不做详细介绍

简单的:

HSV代表色调(Hue),饱和度(Saturation)和明度(Value),
而分离HSV空间,v[0]为H色调,v[1]为S饱和度,v[2]为v灰度

此时图像还需要进行一次滤波处理,过滤掉图中的一些白点

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

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

#遍历替换
for i in range(rows):
  for j in range(cols):
    if dilate[i,j]==255:
      img[i,j]=(255,255,255)#此处替换颜色,为BGR通道
cv2.imwrite('new.jpg',img) #生成的新图片
cv2.waitKey(0)
cv2.destroyAllWindows()

最后便可以得到新的图片:

完整代码如下:

import cv2
import numpy as np
img=cv2.imread('yay.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([90,70,70])
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()

第四行yay.jpg是原图片路径

lower_blue=np.array([90,70,70])里面三个数值可以控制好处理出来的效果和噪点 HSV颜色范围参数调节

img[i,j]=(0,0,255)#此处替换颜色,为BGR通道
修改这里的BGR值即可修改背景颜色

红色 (0,0,255)
白色 (255,255,255)

你可能感兴趣的:(Python学习,图像处理)