簡單人像背景虛化處理思路以下:python
本實例使用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