python-opencv代码给证件照换底色

下载opencv库

pip install opencv-python
pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple

一、opencv是什么?

opencv用C++语言编写,由一系列C函数和少量C++类构成,同时提供了Python、C++、MATLAB等常用编程语言接口,该库具有2500多种优化算法,其中包括一整套经典和最新的计算机视觉和机器学习算法。OpenCV是一个基于BSD许可发行的跨平台计算机视觉库,可以运行在Linux、Windows和Mac OS操作系统上

图片来源

第一张图片来源于一个朋友.画画贼6,图片仅用于知识交流ヾ(•ω•`)o,后面五张图都是每次处理后的过程图.试了几次蓝底变红底和白底,红底变蓝底和白底,突然想到还有派大星的纯色背景图,可是却是白底的,白底变红底和蓝底网上却没找到相关参数如和改,于是就去搜了搜每个函数的参数说明,小伙伴感兴趣可以点击看看
在这里插入图片描述

最后结果呢还是可以的\^o^/,边缘部分还是有些瑕疵,等我学成归来再次更新/( •̀ ω •́ )y

二、使用步骤

1.cv2.imread():读取图片

cv2.imread函数的返回类型为 <class ‘numpy.ndarray’>

import cv2
# 读取照片
img=cv2.imread('cat.jpg')

2.img.shape读入像素

image.shape属性是读入图片后的一个元组dutuple返回图片的(高,宽,位深)

img=cv2.imread('girl.jpg')
rows,cols,channels = img.shape
print(rows,cols,channels)

显示图像的类型以及分辨率可以使用该函数;如果输出为(506, 564, 3)说明该图像是 564*506 的三通道 图像,至于分辨率为什么反过来后面再说

3.cv2.resize():图像缩放

关于resize()函数的参数可以参看该链接

img = cv2.resize(img,None,fx=0.5,fy=0.5)
rows,cols,channels = img.shape
print(rows,cols,channels)
cv2.imshow('img',img)

4.cv2.cvtColor():图片转换为灰度图

cv2.cvtColor函数将读取的图像默认是BGR格式转换为HSV格式,将彩色图片转换为hsv灰度图片,之后才能进行腐蚀和膨胀操作。

hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
cv2.imshow('hsv',hsv)

5.1.cv2.inRange():二值化处理

三色图片有RGB三个颜色通道,无法进行腐蚀和膨胀的操作。这个就需要我们将彩色图片转换为hsv灰度图像后,再完成腐蚀和膨胀的操作。
通过cv2.inRange函数对图片进行二值化操作,获取背景的mask,二值化处理是为了将灰度图片转换为黑白图片。将红色的背景用白色表示,白色区域就是我们后面遍历像素点替换的条件,就是将白色的区域替换为蓝色。
在lower_red和upper_red两个阈值内的像素值设置为白色(255),而不在阈值区间内的像素值设置为黑色(0).
np.array()是为了将列表或者元组中创建数组,更详细内容见我的上一篇博文

import numpy as np
# 蓝底变红底
lower_blue=np.array([90,70,70])
upper_blue=np.array([110,255,255])
mask = cv2.inRange(hsv, lower_blue, upper_blue)
# 红底变蓝底
lower_red= np.array([0,135,135])
upper_red = np.array([180,245,230])
mask = cv2.inRange(hsv, lower_red, upper_red)
# 白底变红底
lower_white=np.array([251,251,251])
upper_white=np.array([255,255,255])
mask = cv2.inRange(img, lower_white, upper_white)

cv2.imshow('mask',mask)

5.2.cv2.threshold()二值化处理

关于cv2.threshold()函数如何二值化处理可以点击参考

import cv2
# 灰度处理
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.imshow('gray',gray)
# cv2.threshold()二值化
_,thres = cv2.threshold(gray, 180, 255, cv2.THRESH_BINARY_INV)
cv2.imshow('thres',thres)

6.cv2.erode/cv2.dilate腐蚀膨胀

在进行二值化操作之后,可以看到黑色区域有一些噪音,均可以消除噪音

erode=cv2.erode(mask,None,iterations=1)
cv2.imshow('erode',erode)
dilate=cv2.dilate(erode,None,iterations=1)
cv2.imshow('dilate',dilate)

7.遍历像素点替换背景颜色

对上述进行了腐蚀或者膨胀操作的图片进行像素点遍历,将白色区域的像素点的位置,也就是原图的背景部分的像素的对应的位置,替换成你想要替换的底色即可。

for i in range(rows):
  for j in range(cols):
    if dilate[i,j]==255: # 像素点为255表示的是白色,我们就是要将白色处的像素点,替换为红色
      img[i,j]=(0,0,255) # 此处替换颜色,为BGR通道,不是RGB通道

变蓝底(255,0,0)
变红底(0,0,255)
变白底(255, 255, 255)

8.imshow():展示图片

cv2.imshow('new_img', img)
设置窗口等待,如果不设置,窗口会一闪而过;
cv2.waitKey(0)# 窗口等待命令  0表示无限等待
cv2.destroyAllWindows()

三、源码展示

白底变红底,与蓝底和红底不同,其背景就是白的,所以二值化处理时直接设置颜色阈值,不用转为灰度图

import cv2
import numpy as np
# 读取照片
img=cv2.imread('D:\\Patrick_Star.jpg')

# 图像缩放
img = cv2.resize(img,None,fx=0.2,fy=0.2)
rows,cols,channels = img.shape
print(rows,cols,channels)
cv2.imshow('img',img)

# 图片转换为灰度图
#hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
#cv2.imshow('hsv',hsv)

#二值化处理将图片转为黑白两色,但因为本来就是白底照片,因此在设置颜色上需要调整
# 图片的二值化处理
lower_white=np.array([251,251,251])
upper_white=np.array([255,255,255])
mask = cv2.inRange(img, lower_white, upper_white)
cv2.imshow('mask',mask)

#二值化处理方法二
# 图片转换为灰度图
# hsv = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# cv2.imshow('hsv',hsv)

# 二值化处理
# thres=cv2.threshold(hsv,251,255,cv2.THRESH_BINARY)[1]
# cv2.imshow('thres',thres)

#腐蚀膨胀 如上图腐蚀一次,眼睛部分还是有白点
erode_1=cv2.erode(mask,None,iterations=1)
cv2.imshow('erode_1',erode_1)
erode_2=cv2.erode(erode_1,None,iterations=1)
cv2.imshow('erode_2',erode_2)

dilate=cv2.dilate(erode_2,None,iterations=1)
dilate=cv2.dilate(dilate,None,iterations=1)
cv2.imshow('dilate',dilate)

#遍历替换
for i in range(rows):
  for j in range(cols):
    if dilate[i,j]==255: # 像素点为255表示的是白色,我们就是要将白色处的像素点,替换为红色
      img[i,j]=(0,0,255) # 此处替换颜色,为BGR通道,不是RGB通道
cv2.imshow('res',img)

# 窗口等待的命令,0表示无限等待
cv2.waitKey(0)
  • 4
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值