人臉區域馬賽克,圓形(心形)模糊Mask

本篇主要介紹使用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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章