opencvcomputer-visionfeature-extractiondlibfacial-landmark-alignment

Extracted Facial Region using DLIB contain noise


Greeting, I have been trying to extract some regions from the face In this case (upper lip) using Dlib, the thing is after extracting the ROI (which look perfect) I realized that there is some noise around the ROI Can't figure out what I'm doing wrong, and how to resolve this issue. This is the used Python code:

import cv2
import numpy as np
import dlib
import os 
from scipy import ndimage, misc
import time

def extract_index_nparray(nparray):
    index = None
    for num in nparray[0]:
        index = num
        break
    return index
img = cv2.imread( 'input_facial_image.jpg')
img=cv2.resize(img,(512,512))
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
mask = np.zeros_like(img_gray)
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor("/facial-landmarks-recognition/shape_predictor_68_face_landmarks.dat")
# Face 1
faces = detector(img_gray)
for face in faces:
    landmarks = predictor(img_gray, face)
    landmarks_points = []
    for n in [48,49,50,51,52,53,54,64,63,62,61,60]:
        x = landmarks.part(n).x
        y = landmarks.part(n).y
        landmarks_points.append((x, y))
   points = np.array(landmarks_points, np.int32)
   convexhull = cv2.convexHull(points)
   # cv2.polylines(img, [convexhull], True, (255, 0, 0), 3)
   cv2.fillConvexPoly(mask, convexhull, 255)

   face_image_1 = cv2.bitwise_or(img, img, mask=mask)
   cv2.imwrite('extracted_lips.jpg', face_image_1 )

The extracted image looks like this : upper lips extracted image But in further steps in my work, I realized a noise around the upper lip, so I examined and I found unclean_upperlip Is there any way to get rid of the noise during the ROI extracting or any image processing technique to bypass this issue? Thanks in advance


Solution

  • For anyone who faced the same issue as me, it's simple. Just change the output format to png. The JPG compressing is the issue here. I hope that this helps