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

文章目录

  • 下载opencv库
  • 一、opencv是什么?
    • 图片来源
  • 二、使用步骤
      • 1.cv2.imread():读取图片
      • 2.img.shape读入像素
      • 3.cv2.resize():图像缩放
      • 4.cv2.cvtColor():图片转换为灰度图
      • 5.1.cv2.inRange():二值化处理
      • 5.2.cv2.threshold()二值化处理
      • 6.cv2.erode/cv2.dilate腐蚀膨胀
      • 7.遍历像素点替换背景颜色
      • 8.imshow():展示图片
  • 三、源码展示

下载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,后面五张图都是每次处理后的过程图.试了几次蓝底变红底和白底,红底变蓝底和白底,突然想到还有派大星的纯色背景图,可是却是白底的,白底变红底和蓝底网上却没找到相关参数如和改,于是就去搜了搜每个函数的参数说明,小伙伴感兴趣可以点击看看
python+opencv代码给证件照换底色_第1张图片

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

二、使用步骤

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

cv2.imread函数的返回类型为

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)

你可能感兴趣的:(数字图像处理,python,opencv,计算机视觉)