• 证件照快速抠图更换背景 - Python OpenCV图像分割


    需要更换证件照的背景,大多软件App直接收费或者需要支付后才可去水除印,本文公开不收费,欢迎使用,代码可在IDE如PyCharm或者Linux上直接运行,程序会自动安装依赖库OpenCV,如果觉得不错随手点个赞哦 :)

    1.常用的图像分割算法

    下面提供两种常用的图像分割算法,精确的图像分割之后可用于证件照替换背景。

    1.1. GrabCut算法:

    GrabCut是一种基于迭代优化的分割算法,它可以根据用户提供的矩形区域自动分割前景和背景。这个算法在前面的示例代码中已经提到过,它可以更精确地分割出前景对象,并进行背景替换。

    1.2. 神经网络图像分割:

    近年来,深度学习技术的发展使得神经网络图像分割算法变得流行。例如,U-Net、Mask R-CNN和DeepLab等神经网络模型可以用于图像分割任务。这些模型在训练阶段使用大量标注的图像数据,可以更准确地分割出前景对象。你可以通过使用已经训练好的模型或自行训练一个模型来进行图像分割和背景替换。

    2.图像分割证件照快速抠图更换背景

    2.1. 证件照背景色颜色定义RGB

    尝试使用OpenCV库中的GrabCut算法进行图像分割证件照快速抠图更换背景。

    常见证件照的背景颜色 RGB 值,注意OpenCV 颜色通道顺序为 B G R

    1. # 定义常用背景颜色,注意OpenCV 颜色通道顺序为 B G R
    2. blue_BGR = (240, 167, 2) # 蓝色
    3. white_BGR = (255, 255, 255) # 白色
    4. red_BGR = (27, 0, 217) # 红色
    5. blue_white_BGR = (196, 146, 52) # 蓝白渐变色
    6. light_gray_BGR = (210, 210, 210) # 浅灰色

    2.2. 完整Python源码

    图像分割证件照快速抠图更换背景

    完整Python源码:

    1. import cv2
    2. import numpy as np
    3. import concurrent.futures
    4. def process_image(image, new_background_color):
    5. # 如果原图尺寸太大,可以进行图像压缩
    6. scale_percent = 50 # 压缩比例(50%)
    7. # 计算压缩后的图像尺寸
    8. width = int(image.shape[1] * scale_percent / 100)
    9. height = int(image.shape[0] * scale_percent / 100)
    10. dim = (width, height)
    11. # 调整图像尺寸
    12. resized_image = cv2.resize(image, dim, interpolation=cv2.INTER_AREA)
    13. # 进行图像处理
    14. result = grabcut_segmentation(resized_image, new_background_color)
    15. # 返回处理结果
    16. return result
    17. def grabcut_segmentation(image, new_background_color):
    18. # 创建掩膜
    19. mask = np.zeros(image.shape[:2], np.uint8)
    20. # 定义GrabCut算法所需的前景和背景模型
    21. bgd_model = np.zeros((1, 65), np.float64)
    22. fgd_model = np.zeros((1, 65), np.float64)
    23. # 定义矩形区域,包含前景对象(根据实际需要调整矩形位置和大小)
    24. height, width = image.shape[:2]
    25. rect = (10, 10, width - 10, height - 10)
    26. # 执行GrabCut算法, 通过调整num_iterations参数来控制迭代次数,以平衡速度和准确性
    27. num_iterations = 5
    28. cv2.grabCut(image, mask, rect, bgd_model, fgd_model, num_iterations, cv2.GC_INIT_WITH_RECT)
    29. # 创建前景和背景掩膜
    30. mask_foreground = np.where((mask == 2) | (mask == 0), 0, 1).astype('uint8')
    31. mask_background = 1 - mask_foreground
    32. # 创建纯色背景图像
    33. background = np.zeros_like(image, np.uint8)
    34. background[:] = new_background_color
    35. # 将前景放在白色背景上
    36. foreground = cv2.bitwise_and(image, image, mask=mask_foreground)
    37. result = cv2.add(foreground, cv2.bitwise_and(background, background, mask=mask_background))
    38. return result
    39. # 安装所需的依赖库
    40. # 使用pip安装OpenCV
    41. try:
    42. import cv2
    43. except ImportError:
    44. import os
    45. import sys
    46. import subprocess
    47. def install(package):
    48. subprocess.check_call([sys.executable, "-m", "pip", "install", package])
    49. install("opencv-python")
    50. # 定义常用背景颜色,注意OpenCV 颜色通道顺序为 B G R
    51. blue_BGR = (240, 167, 2) # 蓝色
    52. white_BGR = (255, 255, 255) # 白色
    53. red_BGR = (27, 0, 217) # 红色
    54. blue_white_BGR = (196, 146, 52) # 蓝白渐变色
    55. light_gray_BGR = (210, 210, 210) # 浅灰色
    56. new_background_color = blue_BGR # 新的背景色
    57. # 原图像和输出图像
    58. image_path = 'input.jpg'
    59. output_path = 'output.jpg'
    60. # 读取原图像
    61. image = cv2.imread(image_path)
    62. # 使用多线程处理单张照片
    63. with concurrent.futures.ThreadPoolExecutor() as executor:
    64. result = executor.submit(process_image, image, new_background_color)
    65. # 获取处理结果
    66. result = result.result()
    67. # 显示和保存处理结果
    68. cv2.imshow('Result', result)
    69. cv2.waitKey(0)
    70. cv2.destroyAllWindows()
    71. # 保存结果图像
    72. cv2.imwrite(output_path, result)

    2.3. 代码运行,结果展示

    3. 简单粗暴快速更换证件照背景颜色

    最简单的办法是,圈出需要替换的颜色的范围,然后直接替换成期望的颜色即可。适用于主题前景包括人脸发色服装颜色跟背景颜色明显反差,比如红色和蓝色背景效果都不错。

    3.1. 获取背景颜色RGB范围

    使用画图/Paint工具打开需要处理的图片,使用颜色提取工具获得具体的颜色RGB值,随机取样几个点,如背景中心,头发和背景颜色边缘处,人脸和背景颜色边缘处,服装和背景颜色边缘处,获取背景色RGB的取值范围。

    3.2. 替换背景颜色RGB取值范围

    根据上述样本点的背景颜色RGB值,调整下面的背景颜色RGB取值范围,注意OpenCV 颜色通道顺序为 B G R

    1. # 定义颜色范围 注意OpenCV 颜色通道顺序为 B G R
    2. # 蓝色
    3. lower_blue = np.array([100, 0, 0]) # 蓝色的下限(BGR格式)
    4. upper_blue = np.array([255, 100, 100]) # 蓝色的上限(BGR格式)

    3.3. 更换背景颜色完整Python源码

    不需要压缩原图,不需要并行加速处理,因为处理方法简单,速度飞快。有时,最简单的办法就可以解决最初的需求。

    1. import cv2
    2. import numpy as np
    3. # 用法
    4. input_image_path = 'input_original.jpg' # 输入图像路径
    5. output_image_path = 'output_original.jpg' # 输出图像路径
    6. # 定义颜色范围 注意OpenCV 颜色通道顺序为 B G R
    7. # 蓝色
    8. lower_blue = np.array([100, 0, 0]) # 蓝色的下限(BGR格式)
    9. upper_blue = np.array([255, 100, 100]) # 蓝色的上限(BGR格式)
    10. # 红色
    11. lower_red = np.array([0, 0, 100]) # 红色的下限(BGR格式)
    12. upper_red = np.array([100, 100, 255]) # 红色的上限(BGR格式)
    13. # 定义常用背景颜色,注意OpenCV 颜色通道顺序为 B G R
    14. blue_BGR = [240, 167, 2] # 蓝色
    15. white_BGR = [255, 255, 255] # 白色
    16. red_BGR = [27, 0, 217] # 红色
    17. blue_white_BGR = [196, 146, 52] # 蓝白渐变色
    18. light_gray_BGR = [210, 210, 210] # 浅灰色
    19. replacement_color = light_gray_BGR # 替换的颜色(白色)
    20. # 读取原始图像
    21. image = cv2.imread(input_image_path)
    22. # 创建蓝色的掩膜
    23. blue_mask = cv2.inRange(image, lower_blue, upper_blue)
    24. # 将蓝色区域替换为指定新的背景颜色
    25. image[np.where(blue_mask)] = replacement_color
    26. # 保存替换后的图像
    27. cv2.imwrite(output_image_path, image)

  • 相关阅读:
    独孤思维:没学会走就要跑,你只能一辈子是穷b
    如何更改eclipse的JDK版本
    函数的节流和防抖?节流和防抖的区别及实现
    Qt程序打包成.exe可执行文件
    Node核心模块之Stream
    停车场系统源码
    抽象类、模板方法模式
    软考考试多少分算通过?
    6.< tag-动态规划和打家劫舍合集(树形DP)>lt.198.打家劫舍 + lt.213. 打家劫舍 II + lt.337. 打家劫舍 III dbc
    清道夫受体-A靶向脂肪酸修饰白蛋白纳米粒/银耳多糖修饰白蛋白微球的制备
  • 原文地址:https://blog.csdn.net/holyvslin/article/details/133670386