您当前的位置:首页 > IT编程 > python
| C语言 | Java | VB | VC | python | Android | TensorFlow | C++ | oracle | 学术与代码 | cnn卷积神经网络 | gnn | 图像修复 | Keras | 数据集 | Neo4j | 自然语言处理 | 深度学习 | 医学CAD | 医学影像 | 超参数 | pointnet | pytorch | 异常检测 | Transformers | 情感分类 | 知识图谱 |

自学教程:python 使用OpenCV进行简单的人像分割与合成

51自学网 2021-10-30 23:02:41
  python
这篇教程python 使用OpenCV进行简单的人像分割与合成写得很实用,希望能帮到您。

实现思路

通过背景建模的方法,对源图像中的动态人物前景进行分割,再将目标图像作为背景,进行合成操作,获得一个可用的合成影像。

实现步骤如下。

使用BackgroundSubtractorMOG2进行背景分割

BackgroundSubtractorMOG2是一个以高斯混合模型为基础的背景前景分割算法,

混合高斯模型

分布概率是K个高斯分布的和,每个高斯分布有属于自己的 μμ 和 σσ 参数,以及对应的权重参数,权重值必须为正数,所有权重的和必须等于1,以确保公式给出数值是合理的概率密度值。换句话说如果我们把该公式对应的输入空间合并起来,结果将等于1。

回到原算法,它的一个特点是它为每一个像素选择一个合适数目的高斯分布。基于高斯模型的期望和标准差来判断混合高斯模型模型中的哪个高斯模型更有可能对应这个像素点,如果不符合就会被判定为前景。

使用人像识别填充面部信息

创建级联分类器

face_cascade = cv2.CascadeClassifier()face_cascade.load(  '/usr/local/anaconda3/envs/OpenCV/lib/python3.8/site-packages/cv2/data/haarcascade_frontalface_default.xml')

使用OpenCV自带的级联分类器,加载OpenCV的基础人像识别数据。

识别源图像中的人像

faces = face_cascade.detectMultiScale(gray, 1.3, 5)

使用形态学填充分割出来的前景

# 形态学开运算去噪点fgmask = cv2.morphologyEx(fgmask, cv2.MORPH_OPEN, kernel)for i in range(15):  fgmask = cv2.dilate(fgmask, kernel, iterations=1)

通过开操作去掉前景图像数组中的噪点,然后重复进行膨胀,填充前景轮廓。

将人像与目标背景进行合成

def resolve(o_img, mask, faces):  if len(faces) == 0:    return  (x, y, w, h) = faces[0]  rgb_mask_front = cv2.cvtColor(mask, cv2.COLOR_GRAY2BGR)  rgb_mask_front = cv2.bitwise_not(rgb_mask_front)  cv2.circle(rgb_mask_front, (int(x + w / 2), int(y + h / 2)), int((w + h) / 4), (0, 0, 0), thickness=-1)  o_img = cv2.subtract(o_img, rgb_mask_front)  return o_img

将分割出来的部分取反再与源图像进行减操作,相当于用一个Mask从原图中抠出一部分。

再与背景进行加操作

out = resolve(frame, fgmask, faces)out = cv2.add(out, c_frame)

代码实现

import numpy as npimport cv2import os# 经典的测试视频camera = cv2.VideoCapture('./source/background_test2.avi')cap = cv2.VideoCapture('./source/camera_test2.avi')face_cascade = cv2.CascadeClassifier()face_cascade.load(   os.getcwd()+'/source/haarcascade_frontalface_default.xml')# 形态学操作需要使用kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3))# 创建混合高斯模型用于背景建模fgbg = cv2.createBackgroundSubtractorMOG2(detectShadows=False)def resolve(o_img, mask, faces):  if len(faces) == 0:    return  (x, y, w, h) = faces[0]  rgb_mask_front = cv2.cvtColor(mask, cv2.COLOR_GRAY2BGR)  rgb_mask_front = cv2.bitwise_not(rgb_mask_front)  cv2.circle(rgb_mask_front, (int(x + w / 2), int(y + h / 2)), int((w + h) / 4), (0, 0, 0), thickness=-1)  o_img = cv2.subtract(o_img, rgb_mask_front)  return o_imgwhile True:  ret, frame = cap.read()  c_ret, c_frame = camera.read()  gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)  fgmask = fgbg.apply(frame)  # 形态学开运算去噪点  fgmask = cv2.morphologyEx(fgmask, cv2.MORPH_OPEN, kernel)  gray_camera = cv2.cvtColor(c_frame, cv2.COLOR_BGR2GRAY)  for i in range(15):    fgmask = cv2.dilate(fgmask, kernel, iterations=1)  faces = face_cascade.detectMultiScale(gray, 1.3, 5)  out = resolve(frame, fgmask, faces)  out = cv2.add(out, c_frame)  cv2.imshow('Result', out)  cv2.imshow('Mask', fgmask)  k = cv2.waitKey(150) & 0xff  if k == 27:    breakout.release()camera.release()cap.release()cv2.destroyAllWindows()

以上就是python 使用OpenCV进行简单的人像分割与合成的详细内容,更多关于python opencv人像分割与合成的资料请关注51zixue.net其它相关文章!


Python 中 sorted 如何自定义比较逻辑
M1芯片安装python3.9.1的实现
万事OK自学网:51自学网_软件自学网_CAD自学网自学excel、自学PS、自学CAD、自学C语言、自学css3实例,是一个通过网络自主学习工作技能的自学平台,网友喜欢的软件自学网站。