使用numpy.ogrid 生成圆形(心形)模糊遮罩,可用于人脸区域马赛克
本篇主要介绍使用numpy.ogrid 生成圆形(心形)模糊遮罩,可以用在对人脸检测后进行人脸的模糊处理。
主要的代码如下(其中涉及到人脸检测部分的可以参考使用mtcnn进行人脸检测):
from mtcnn.mtcnn import MTCNN
import cv2
import numpy as np
img = cv2.imread("test.jpg")
detector = MTCNN()
face_list = detector.detect_faces(img) # face detect and alignment
def generate_mask(img_height,img_width,radius,center_x,center_y):
y,x=np.ogrid[0:img_height,0:img_width]
# circle mask
# mask = (x-center_x)**2+(y-center_y)**2<=radius**2
# generate other masks (eg. heart-shaped)
scale = 5/radius
mask = 5*((-x+center_x)*scale)**2 - 6*np.abs((-x+center_x)*scale)*((-y+center_y)*scale) + 5*((-y+center_y)*scale)**2 < 128
return mask
mask_img = np.ones(img.shape,np.int8)
kernel_size = 15
blur_img = cv2.blur(img,(kernel_size,kernel_size))
for face in face_list:
box = face["box"]
#boundingbox
x,y,w,h = box
mask=generate_mask(img.shape[0],img.shape[1],max(w,h)/2,x+w/2,y+h/2)
mask_img[mask]=[0,0,0]
mask_img_verse = np.ones(img.shape,np.int8) - mask_img
result_img = mask_img * img + mask_img_verse * blur_img
cv2.imwrite("result.jpg",result_img)
圆形模糊的结果如下:
实际上,如果是要产生圆形的模糊,更简洁的方法是使用cv.circle()函数实现:
circle = np.zeros(img.shape, dtype="uint8")
cv2.circle(circle, (300, 300), 50, [0,0,0], -1)
借助numpy.ogrid和任意的图形函数可以产生任意形式的遮罩,例如产生心形的模糊遮罩:
其中使用的产生心形区域的代码为:
scale = 5/radius
mask = 5*((-x+center_x)*scale)**2 - 6*np.abs((-x+center_x)*scale)*((-y+center_y)*scale) + 5*((-y+center_y)*scale)**2 < 128
心形线的产生函数为:5x^2 – 6|x|y + 5y^2 = 128
图像如下:
对心形进行适当的旋转、平移和缩放之后即可合适地遮住人脸(物体)。这里顺便推荐一个在线绘制函数曲线的网站Desmos。