zoukankan      html  css  js  c++  java
  • 教你用OpenCV 和 Python给证件照换底色(蓝底 <->红底->白底)

    在我们的生活中常常要用到各种底色要求的证件电子照,红底、蓝底、或者白底,而假如你手上只有一种底色的证件照,你又不想再去拍又不会PS怎么办?今天教你们用OpenCV和Python给你的证件照换底色。

    教你用OpenCV 和 Python给证件照换底色(蓝底 <->红底->白底)

     

    • Python3
    • numpy函数库
    • OpenCV库
    • Windows10 + Anaconda+Pycharm
    教你用OpenCV 和 Python给证件照换底色(蓝底 <->红底->白底)

     

    1.读取要换底色的图片

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

    import cv2
    import numpy as np

    # 读取照片并显示
    image=cv2.imread('yang.jpg')
    cv2.imshow('image',image)

    2.对图片进行缩放

    证件照原图太大,不易显示,cv2.resize函数进行缩放处理。

    # 图像缩放并显示
    img = cv2.resize(image,None,fx=0.5,fy=0.5)
    rows,cols,channels = img.shape
    print(rows,cols,channels)
    cv2.imshow('img',img)
    教你用OpenCV 和 Python给证件照换底色(蓝底 <->红底->白底)

     

    3.将图片转换为灰度图像

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

    # 图片转换为灰度图并显示
    hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
    cv2.imshow('hsv',hsv)
    教你用OpenCV 和 Python给证件照换底色(蓝底 <->红底->白底)

     

    4.对图片进行二值化处理

    通过cv2.inRange函数对图片进行二值化操作,获取背景的mask,二值化处理是为了将灰度图片转换为黑白图片,如下图将红色的背景用白色表示,白色区域就是我们后面遍历像素点替换的条件,就是将白色的区域替换为蓝色。

    cv2.inRange(hsv, lower_red, upper_red):在lower_red和upper_red两个阈值内的像素值设置为白色(255),而不在阈值区间内的像素值设置为黑色(0)。

    # 图片的二值化处理
    #红底变蓝底
    #将在两个阈值内的像素值设置为白色(255),而不在阈值区间内的像素值设置为黑色(0)
    lower_red= np.array([0,135,135])
    upper_red = np.array([180,245,230])
    mask = cv2.inRange(hsv, lower_red, upper_red)
    # 显示图像
    cv2.imshow('mask',mask)


    # #蓝底变红底
    # 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)
    教你用OpenCV 和 Python给证件照换底色(蓝底 <->红底->白底)

     

    5.对图片进行腐蚀和膨胀

    在进行二值化操作之后,我们可以看到黑色区域有一些噪声,嘴的部分是白的,还有少数白点,就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)
    教你用OpenCV 和 Python给证件照换底色(蓝底 <->红底->白底)

     

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

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

    dilate[i,j]==255: 像素点为255表示的是白色,我们就要将白色处的像素点,替换为你想要的照片底色。

    img[i,j]=(0,0,255): 此处替换颜色,为BGR通道,不是RGB通道,若是想要将红底变成蓝底img[i,j]=(255,0,0),若是想将蓝底变为红底则img[i,j]=(0,0,255),若是想变白底img[i,j]=(255,255,255)

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


    # 窗口等待的命令,0表示无限等待
    cv2.waitKey(0)

    红底变蓝底

    教你用OpenCV 和 Python给证件照换底色(蓝底 <->红底->白底)

     

    蓝底变红底

    教你用OpenCV 和 Python给证件照换底色(蓝底 <->红底->白底)

     

    变白底

    教你用OpenCV 和 Python给证件照换底色(蓝底 <->红底->白底)

     

    完整代码,关注下面回复:证件照,下载使用。

    更多有关python、深度学习和计算机编程和电脑知识的精彩内容,可以关注微信公众号:码农的后花园

  • 相关阅读:
    spring cloud图形化dashboard是如何实现指标的收集展示的
    浮躁的我们
    c/c++学习系列之内存对齐
    c/c++学习系列之取整函数,数据宽度与对齐
    c/c++学习系列之memset()函数
    c/c++学习系列之putchar、getchar、puts、gets的运用
    c#学习系列之静态类,静态构造函数,静态成员,静态方法(总之各种静态)
    c#学习系列之字段(静态,常量,只读)
    C#中MessageBox用法大全(附效果图)<转>
    c#学习系列之Application.StartupPath的用法(美女时钟的做法)
  • 原文地址:https://www.cnblogs.com/xiamuzi/p/13471367.html
Copyright © 2011-2022 走看看