证件照换背景
生活照转证件照需要做一些处理,包括换背景、扣头像、调尺寸、调光亮、调DPI,网上有很多在线处理程序(有点不安全),本地也有很多离线处理程序(有点不免费)。本文主要记录下在个人电脑上,基于OpenCV、YOLO实现生活照转证件照的过程。
换背景
标准证件照是大家办理各种证书、填写各种档案的必备元素。以前照证件照需要去照相馆,配上背景幕布和补光灯,咔嚓一声,光鲜亮丽的证件照就出来了。现在手机拍照越来越方便,越来越清晰,于是去照相馆拍证件照的需求越来越少,大家更希望基于手机拍摄的生活照做一个证件照。
如果我们有一个标准证件照,只是做下背景的话的,这个比较简单。

核心流程如下:
1 | 基于opencv实现证件照白底转蓝底: |
核心代码如下:
1 | def test_cv_card(): |
核心结果如下:

补充说明:
- 为什么要做闭运算?因为我们在做二值化的时候,取的灰度空间是[230,255],该空间下会有一些比较白(>230)的部分也会被错误的划分为白色背景,因此做了闭运算(先膨胀后腐蚀),把图片内部细节给去掉了。
- 原图一定要闭运算么?由于原图背景是存白的,且人像部分没有非常白的点,因此我们把二值的阈值设置额为[250,255],也可以保证只有背景部分会被抠出来。
遇到问题:
如果背景色是白色,我们可以跟进上面的二值化和闭运算实现背景切换,但如果背景不是那么白,上面的方式就无能为力了,比如下面这个图,只把非常白的地方换成蓝色了,但整个背景墙面没有换。

生活照转证件照
上面提到的场景经常用到,需要把自己的生活照转为证件照,但是又不想使用在线工具。这是可以使用我们yolo-seg快速实现背景切换。
核心流程如下:
1 | 基于yolo-seg实现证件照白底转蓝底: |
核心代码如下:
1 | def test_yolo_seg_card(): |
核心结果过下:

换DPI
有些网站上传的证件照需要调整DPI(每英寸点数),通过Pillow可以快速设置DPI。
核心代码:
1 | def test_change_dpi(): |
核心日志:
1 | 原图片信息 : {'jfif': 257, 'jfif_version': (1, 1), 'jfif_unit': 0, 'jfif_density': (1, 1)} |
注意事项:
JFIF元信息说明
- 'jfif': 257:这通常表示JFIF APP0标记的存在,257是标记的标识符。
- 'jfif_version': (1, 1):表示JFIF的版本是1.1。
- 'jfif_unit': 0:表示没有指定单位,通常0表示无单位,1表示英寸,2表示厘米。
- 'jfif_density': (1,
1):表示X和Y方向的密度,单位是上面
jfif_unit
指定的。由于jfif_unit
为0,这里的密度没有实际意义。
DPI与图像质量:
- DPI主要影响打印时的尺寸比例,不会改变图像的像素质量。
- 提高DPI不会使图像更清晰,除非同时增加了像素尺寸。
文件格式:
- 确保保存为支持DPI信息的格式,如JPEG、TIFF。
- PNG格式通常不支持嵌入DPI信息。
实际应用:
- 在打印照片或制作证件照时,正确的DPI设置非常重要。
常见的证件照要求DPI为300或更高。