前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python OpenCV给证件照换底色

Python OpenCV给证件照换底色

作者头像
用户9925864
发布2022-07-27 08:18:44
1.2K0
发布2022-07-27 08:18:44
举报
文章被收录于专栏:算法工程师的学习日志

投简历、找工作这些事都需要证件照,有些还要求证件照背景颜色、尺寸大小,本文分享一下如果通过Python OpenCV来实现照片裁剪和更换背景色


1、读取照片

代码语言:javascript
复制
import cv2
import numpy as np
# 读取照片
image = cv2.imread('1.jpg')

2、修改照片尺寸

发现图片太大,修改图片尺寸

image = cv2.resize(image,None,fx=0.5,fy=0.5)

第一个参数image:为原始图像

第二个参数size:尺寸数组,我设置None

第三个和第四个参数fx,fy:新图为原图的比例。

比例和尺寸只能设置一个

代码语言:javascript
复制
# 修改尺寸
image = cv2.resize(image, None, fx=0.5, fy=0.5)

3、BGR图片转灰度图

彩色图无法进行梯度闭运算。

闭运算:对图像先进行膨胀再腐蚀,有助于关闭前景物体上的小孔或者小黑点

形态学变换:开运算,闭运算,梯度运算

所以先将图片转换为hsv格式

cv2.cvtColor(img,cv2.COLOR_BGR2HSV)

可以将彩色图片转化为hsv灰度图片

转换成hsv是因为,hsv的色彩空间有表可查。

代码语言:javascript
复制
# 图片转换为二值化图
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
print(hsv)

4、图片二值化处理

形态学变换需要的是二值图片。

cv2.inRange(hsv,lower_red,upper_red)

hsv:图像

lower_red指的是图像中低于这个lower_red的值,图像值变为0

upper_red指的是图像中高于这个upper_red的值,图像值变为0

而在lower_red~upper_red之间的值变成255。

完成二值变换。

每张图的lower_red,upper_red 不同。自己可以查找hsv色彩空间表。然后结合,修改数值。

代码语言:javascript
复制
# 图片的二值化黑白处理
lower_blue = np.array([90, 70, 70])
upper_blue = np.array([110, 255, 255])
heibai = cv2.inRange(hsv, lower_blue, upper_blue)
# 显示
cv2.imshow('image', image)
cv2.imshow('hsv', hsv)
cv2.imshow('heibai', heibai)
# 无限等待
cv2.waitKey(0)
# 销毁内存
cv2.destroyAllWindows()

5、图片去噪

黑白色的照片周围可能有黑色小点噪声。这种情况下需要去除背景色噪声,选用膨胀。

膨胀即对图片高亮色进行膨胀。周围只有有一个为1,即是1;再进行腐蚀,缩小图片尺寸。即闭运算操作。

不同的图片噪声不一样,如是前景色人物含有小白点,则进行开运算操作。

这次颜色的图片中因为颜色分明,不存在明显噪音,如果去除噪音可以采用下面方法

代码语言:javascript
复制
# 闭运算
k = np.ones((5, 5), np.uint8)
r = cv2.morphologyEx(heibai, cv2.MORPH_CLOSE, k)

6、图片颜色替换

遍历黑白照,找到白色像素点的位置索引,同理找到原图(白色像素点对应位置索引),换成颜色替换。

代码语言:javascript
复制
# 颜色替换
imageNew = np.copy(image)
rows, cols, channels = image.shape
for i in range(rows):
    for j in range(cols):
        if r[i, j] == 255:  # 像素点为255表示的是白色,我们就是要将白色处的像素点,替换为红色
            imageNew[i, j] = (0, 0, 255)  # 此处替换颜色,为BGR通道,不是RGB通道

完整代码:

代码语言:javascript
复制
import cv2
import numpy as np

# 读取照片
image = cv2.imread('1.jpg')
# 修改尺寸
image = cv2.resize(image, None, fx=0.5, fy=0.5)
# 图片转换为二值化图
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
print(hsv)
# 图片的二值化黑白处理
lower_blue = np.array([90, 70, 70])
upper_blue = np.array([110, 255, 255])
heibai = cv2.inRange(hsv, lower_blue, upper_blue)
# 闭运算
k = np.ones((5, 5), np.uint8)
r = cv2.morphologyEx(heibai, cv2.MORPH_CLOSE, k)
# 颜色替换
imageNew = np.copy(image)
rows, cols, channels = image.shape
for i in range(rows):
    for j in range(cols):
        if r[i, j] == 255:  # 像素点为255表示的是白色,我们就是要将白色处的像素点,替换为红色
            imageNew[i, j] = (0, 0, 255)  # 此处替换颜色,为BGR通道,不是RGB通道
# 显示
cv2.imshow('image', image)
cv2.imshow('hsv', hsv)
cv2.imshow('heibai', heibai)
cv2.imshow('r', r)
cv2.imshow('imageNew', imageNew)
# 无限等待
cv2.waitKey(0)
# 销毁内存
cv2.destroyAllWindows()
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-11-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 算法工程师的学习日志 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档