opencv实现人像虚化效果
该代码实现了一个基于人脸检测的自动背景虚化功能。首先使用OpenCV的Haar级联分类器检测图像中的人脸区域,然后以人脸为中心扩展生成矩形掩码。通过掩码腐蚀和高斯模糊处理实现边缘羽化效果,最后对背景进行高斯模糊并与前景融合。该方法通过调整模糊核大小和标准差控制虚化强度,并利用掩码加权融合保证过渡自然。代码还提供了实时优化的建议,如缩小图像尺寸或使用简单模糊算法来提高处理速度。
·
import cv2
import numpy as np
# 1. 加载模型(人脸检测器+人脸掩码生成器)
face_cascade = cv2.CascadeClassifier(
cv2.data.haarcascades + "haarcascade_frontalface_default.xml"
) # 人脸检测模型(OpenCV内置)
# 2. 读取图像并检测人脸
img = cv2.imread("Linus.png")
h, w = img.shape[:2]
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5)
if len(faces) == 0:
print("未检测到人脸")
exit()
# 3. 生成人像掩码(基于检测到的人脸区域扩展,覆盖全身)
# 简化处理:以人脸为中心扩展掩码(实际可结合人体分割模型优化)
x, y, w_face, h_face = faces[0]
mask = np.zeros_like(gray)
# 扩展掩码范围(根据人像比例调整,这里设为人脸的2倍宽高)
expand_w = w_face // 2
expand_h = h_face // 2
top = max(0, y - expand_h)
bottom = min(h, y + h_face + expand_h)
left = max(0, x - expand_w)
right = min(w, x + w_face + expand_w)
cv2.rectangle(mask, (left, top), (right, bottom), 255, -1) # 矩形前景掩码
# 模糊强度控制:
# 卷积核大小(ksize):数值越大,模糊越强(需为奇数,如(3,3)→弱,(21,21)→强);
# 标准差(sigmaX/sigmaColor):高斯模糊 / 双边模糊中,数值越大,模糊越均匀(如sigmaX=1→弱,sigmaX=10→强)。
# 边缘保留:
# 需保留边缘时,优先选择双边模糊(bilateralFilter)或中值模糊;
# 局部模糊时,对掩码进行边缘羽化(高斯模糊),避免前景与背景的融合边缘生硬。
# 效率优化:
# 实时场景(如视频虚化):优先使用均值模糊或小核高斯模糊(ksize≤(11,11));
# 大图像虚化:先缩小图像尺寸,模糊后再放大(减少计算量)。
# 4. 优化掩码(边缘羽化,避免融合生硬)
kernel = np.ones((7, 7), np.uint8)
mask = cv2.erode(mask, kernel, iterations=1) # 腐蚀缩小前景,留出羽化空间
mask = cv2.GaussianBlur(mask, (7, 7), 0) # 高斯模糊实现边缘羽化
# 5. 背景模糊+融合
blur_bg = cv2.GaussianBlur(img, (7, 7), sigmaX=10)
# 归一化掩码(0-1范围,用于加权融合)
mask_norm = mask / 255.0
# 融合公式:前景*掩码 + 背景*(1-掩码)(避免边缘生硬)
result = (img * mask_norm[..., None] + blur_bg * (1 - mask_norm[..., None])).astype(np.uint8)
# 6. 显示
cv2.imshow("Original", img)
cv2.imshow("Feathered Mask", mask)
cv2.imshow("Auto Background Blur", result)
cv2.waitKey(0)
cv2.destroyAllWindows()
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)