【问题标题】:Add two images with blended edges添加两个具有混合边缘的图像
【发布时间】:2019-07-12 21:30:15
【问题描述】:

我正在编写一个脚本来检测面部并模糊所有面部。

我使用 Haar Cascades 找到人脸,然后为人脸所在的圆圈创建一个蒙版。然后我把它们加在一起。这适用于添加绝对分隔的位置,但我无法弄清楚如何在没有钝线的情况下关闭模糊锥度。模糊蒙版只会在应该逐渐变细的地方创建一条难看的线。

import numpy as np
import cv2

face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')

original_image = cv2.imread('person.jpg')
gray_original_image = cv2.cvtColor(original_image, cv2.COLOR_BGR2GRAY)

# mask
# detect faces and create mask
mask = np.full(
    (original_image.shape[0], original_image.shape[1], 1), 0, dtype=np.uint8)
faces = face_cascade.detectMultiScale(gray_original_image, 1.3, 5)
face_areas = []
for (x, y, w, h) in faces:
    face_areas.append(([x, y, w, h], original_image[y:y+h, x:x+w]))
    center = (x + w // 2, y + h // 2)
    radius = max(h, w) // 2
    cv2.circle(mask, center, radius, (255), -1)

# blur original image
kernel = np.ones((5, 5), np.float32) / 25
blurred_image = cv2.filter2D(original_image, -1, kernel)
# blur mask to get tapered edge
mask = cv2.filter2D(mask, -1, kernel)

# composite blurred and unblurred faces
mask_inverted = cv2.bitwise_not(mask)
background = cv2.bitwise_and(
    blurred_image, blurred_image, mask=mask_inverted)
foreground = cv2.bitwise_and(original_image, original_image, mask=mask)

composite = cv2.add(background, foreground)

cv2.imshow('composite', composite)
cv2.waitKey(0)
cv2.destroyAllWindows()

原创

脚本的输出

期望的结果(模糊/非模糊之间没有明显的界限)

【问题讨论】:

标签: python opencv


【解决方案1】:

您完成了大部分工作,而不是 cv2.mean,顺便说一句,当我尝试时它不起作用,只需这样做:

composite = (foreground + background)

你会得到:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-08
    • 2020-02-26
    • 2018-08-12
    • 2018-02-24
    • 1970-01-01
    • 2020-08-07
    • 1970-01-01
    相关资源
    最近更新 更多