深度学习与图像处理之:人像背景虚化

深度学习与图像处理之:人像背景虚化

简单实现思路:

  1. 对图像内容进行分割,提取人像
  2. 对图像背景进行模糊化处理
  3. 将人像和背景重新合成

在这里,使用DeepLabV3模型对图像内容进行分割并提取人像,实现的代码如下:

import numpy as np
import tensorflow as tf
import cv2
from deeplabmodel import *

def create_pascal_label_colormap():
    colormap = np.zeros((256, 3), dtype=int)
    ind = np.arange(256, dtype=int)

    for shift in reversed(range(8)):
        for channel in range(3):
            colormap[:, channel] |= ((ind >> channel) & 1) << shift
            ind >>= 3
    return colormap

def label_to_color_image(label):
    if label.ndim != 2:
        raise ValueError('Expect 2-D input label')

    colormap = create_pascal_label_colormap()

    if np.max(label) >= len(colormap):
        raise ValueError('label value too large.')
    return colormap[label]

def load_model():
    model_path = '../resources/models/tensorflow/deeplabv3_mnv2_pascal_train_aug_2018_01_29.tar.gz'#'deeplab_model.tar.gz'
    MODEL = DeepLabModel(model_path)
    print('model loaded successfully!')
    return MODEL

model = load_model()

src = cv2.imread('../resources/images/person2.jpg')
resized_im, seg_map = model.run2(src)
seg_image = label_to_color_image(seg_map).astype(np.uint8)
print(seg_map.dtype)
# seg_map = cv2.GaussianBlur(np.uint8(seg_map),(11,11),0)
src_resized = cv2.resize(src,(resized_im.shape[1],resized_im.shape[0]))
seg_image = cv2.GaussianBlur(seg_image,(11,11),0)
bg_img = np.zeros_like(src_resized)

bg_img[seg_map == 0] = src_resized[seg_map == 0]

blured_bg = cv2.GaussianBlur(bg_img,(11,11),0)
result = np.zeros_like(bg_img)

result[seg_map > 0] = resized_im[seg_map > 0]
result[seg_map == 0] = blured_bg[seg_map == 0]

cv2.imshow("seg_image",seg_image)
cv2.imshow('bg_image',bg_img)
cv2.imshow('blured_bg',blured_bg)
cv2.imshow('result',result)


cv2.waitKey()
cv2.destroyAllWindows()

原图:

7e020385b7f849650732179073836fb7e3a.jpg

人像提取结果:

6b516182c06a4d2cda5f0d8cc5d6b454c99.jpg

背景图像:

5127e0a633d4d3692791409496926f3c54d.jpg

背景模糊图像:

1970cb6ac0e2284978c3861dae6210b138a.jpg

合成结果:

270238fa83890e39560947e617be85de3e6.jpg

效果不太理想,但总体上实现了背景虚化。后期将进行细节优化。

转载于:https://my.oschina.net/wujux/blog/2054878

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/101409.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • vim查看空格回车符号_linux vi 替换字符串

    vim查看空格回车符号_linux vi 替换字符串参考链接https://blog.csdn.net/qq_30038111/article/details/83447045答案就是需要转义

    2022年9月16日
    2
  • mapper怎么用_当前余额和通用余额

    mapper怎么用_当前余额和通用余额通用Mapper是一个可以实现任意MyBatis通用方法的框架,提供了常规的增删改查操作以及Example相关的单表操作。解决MyBatis使用中90%的基本操作,使用它可以很方便的进行开发,可以节省开发人员大量的时间。…

    2022年10月6日
    2
  • 磁盘管理不显示新硬盘_动态磁盘改为基本磁盘

    磁盘管理不显示新硬盘_动态磁盘改为基本磁盘文章目录一.磁盘简介1.磁盘设备的命名2.磁盘的分区方式二.管理磁盘1.查看磁盘2.创建分区3.创建文件系统——格式化4.挂载(临时)5.查看挂载信息6.扩展分区7.交换分区Swap三.逻辑卷LVMLinux08:磁盘管理相关一.磁盘简介1.磁盘设备的命名CentOS 7中IDE(并口)SATA(串口)——目前更适用/dev/sda/dev/sdb/dev是一个专门存放设备的目录,s代表sata就是串口,d代表disk磁盘,a代表第一块,b代表第二块…2.磁盘的分区方式

    2022年8月9日
    7
  • switch流控(flow control)

    switch流控(flow control)半双工:在switch中又叫做背压(BackPressure)添加链接描述。在交换机进行数据转发时,同一时间内,只能发送或者接受数据。利用冲突检测机制在端口接受数据时,抑制本端口发送。全双工:switch可以在转发时,同时接收和发送数据。1.pause帧2.非对称流控3.pause时间交换机在进行内部数据转发的时,内部需要一个packagebuff进行数据缓存,在多个端口同时向…

    2022年6月5日
    53
  • python numpy dtype object_关于Numpy数据类型对象(dtype)使用详解

    python numpy dtype object_关于Numpy数据类型对象(dtype)使用详解常用方法#记住引入numpy时要是用别名np,则所有的numpy字样都要替换#查询数值类型>>>type(float)dtype(‘float64’)#查询字符代码>>>dtype(‘f’)dtype(‘float32’)>>>dtype(‘d’)dtype(‘float64’)#查询双字符代码>>>dtype(‘f…

    2022年5月27日
    39
  • ajax中headers无法传参,jquery ajax怎么通过header传递参数

    ajax中headers无法传参,jquery ajax怎么通过header传递参数

    2021年11月27日
    46

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号