深度學習與圖像處理實例:人像背景虛化與背景替換

簡單人像背景虛化處理思路以下:python

  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')
# 背景圖像
src_view = cv2.imread('../resources/images/view.jpg')

resized_im, seg_map = model.run2(src)
resized_view = cv2.resize(src_view,(resized_im.shape[1],resized_im.shape[0]))
resized_view = cv2.medianBlur(resized_view,11)
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]

# 背景變換與合成
result_2 = np.zeros_like(bg_img)
result_2[seg_map > 0] = src_resized[seg_map > 0]
result_2[seg_map == 0] = resized_view[seg_map == 0]

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

cv2.waitKey()
cv2.destroyAllWindows()

程序運行結果:優化

原始圖像:ui

提取的人像Mask圖像:code

背景圖像:orm

背景模糊圖像:blog

背景虛化結果:input

背景替換結果:深度學習

基本實現人像背景虛化效果與背景替換,可是還有不少細節沒有優化,後期將進一步優化。it

相關文章
相關標籤/搜索