简单实现思路:
- 对图像内容进行分割,提取人像
- 对图像背景进行模糊化处理
- 将人像和背景重新合成
在这里,使用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()
原图:
人像提取结果:
背景图像:
背景模糊图像:
合成结果:
效果不太理想,但总体上实现了背景虚化。后期将进行细节优化。
转载于:https://my.oschina.net/wujux/blog/2054878
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/101409.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...