importnumpyasnp# Parse facemask=parser.parse(face_image)# Extract specific componentSKIN=1HAIR=18LEFT_EYE=4RIGHT_EYE=5# Binary mask for skinskin_mask=(mask==SKIN).astype(np.uint8)*255# Binary mask for hairhair_mask=(mask==HAIR).astype(np.uint8)*255# Binary mask for eyeseyes_mask=((mask==LEFT_EYE)|(mask==RIGHT_EYE)).astype(np.uint8)*255
importcv2importnumpyasnpdefapply_lip_color(image,mask,color=(180,50,50)):"""Apply lip color using parsing mask."""result=image.copy()# Get lip mask (upper + lower lip)lip_mask=((mask==13)|(mask==14)).astype(np.uint8)# Create color overlayoverlay=np.zeros_like(image)overlay[:]=color# Blend with originallip_region=cv2.bitwise_and(overlay,overlay,mask=lip_mask)non_lip=cv2.bitwise_and(result,result,mask=1-lip_mask)# Combine with alpha blendingalpha=0.4result=cv2.addWeighted(result,1-alpha*lip_mask[:,:,np.newaxis]/255,lip_region,alpha,0)returnresult.astype(np.uint8)
Background Replacement
defreplace_background(image,mask,background):"""Replace background using parsing mask."""# Create foreground mask (everything except background)foreground_mask=(mask!=0).astype(np.uint8)# Resize background to match imagebackground=cv2.resize(background,(image.shape[1],image.shape[0]))# Combineresult=image.copy()result[foreground_mask==0]=background[foreground_mask==0]returnresult
Hair Segmentation
defget_hair_mask(mask):"""Extract clean hair mask."""hair_mask=(mask==18).astype(np.uint8)*255# Clean up with morphological operationskernel=np.ones((5,5),np.uint8)hair_mask=cv2.morphologyEx(hair_mask,cv2.MORPH_CLOSE,kernel)hair_mask=cv2.morphologyEx(hair_mask,cv2.MORPH_OPEN,kernel)returnhair_mask
Visualization Options
fromuniface.visualizationimportvis_parsing_maps# Default visualizationvis_result=vis_parsing_maps(face_rgb,mask)# With different parametersvis_result=vis_parsing_maps(face_rgb,mask,save_image=False,# Don't save to file)