Как размыть лицо в opencv с круглыми границами - Python? - PullRequest
1 голос
/ 29 марта 2020

Я размыл лицо в OpenCV так:

image

Я использовал этот код:

face = cv2.medianBlur(face, 100) 
img[top:bottom,left:right] = face

Но я хочу сделать границу лица круглой вот так (не обязательно быть идеальным)

Output image

Ответы [ 3 ]

3 голосов
/ 29 марта 2020

Сначала создайте изображение маски. Для этого нарисуйте белый кружок в месте расположения лица на черном изображении.

Во-вторых, размытие всего изображения.

В-третьих, скопируйте размытое содержимое в исходное изображение только там, где есть маска. > 0.

p1 = (65, 65)
w, h = 100, 100
p2 = (p1[0] + w, p1[1] + h)


circle_center = ((p1[0] + p2[0])// 2, (p1[1] + p2[1]) // 2)
circle_radius = int(math.sqrt(w * w + h * h) // 2)
mask_img = np.zeros(img.shape, dtype='uint8')
cv2.circle(mask_img, circle_center, circle_radius, (255, 255, 255), -1)

img_all_blurred = cv2.medianBlur(img, 99)
img_face_blurred = np.where(mask_img > 0, img_all_blurred, img)

Выход:

enter image description here

1 голос
/ 29 марта 2020
import cv2
import matplotlib.pyplot as plt
import numpy as np

img = cv2.imread('image.jpg')
h, w, c = img.shape

plt.imshow(img)
plt.show()

c_mask = np.zeros((h,w), np.uint8)
cv2.circle(c_mask,(w//2,h//2),100,1,thickness=-1)

mask = cv2.bitwise_and(img, img, mask=c_mask)

plt.imshow(mask)
plt.show()

img_mask = img - mask

plt.imshow(img_mask)
plt.show()

blur = cv2.blur(img,(17, 17))


plt.imshow(blur)
plt.show()

mask2 = cv2.bitwise_and(blur, blur, mask=c_mask)

plt.imshow(mask2)
plt.show()

final_img = img_mask + mask2

print(np.max(final_img))

plt.imshow(final_img)
plt.show()

enter image description here

0 голосов
/ 29 марта 2020

Вы можете размыть все изображение, а затем скопировать результат в источник, используя любую маску.

...