OpenCV (60) --- Реализовать эффект ручного удаления прыщей на лице

OpenCV
OpenCV (60) --- Реализовать эффект ручного удаления прыщей на лице

Принцип удаления прыщей на лице

Фактически, в предыдущей дермабразии и отбеливании лица мы уже завершили удаление акне на человеческом лице, поскольку высокая степень дермабразии (двусторонняя фильтрация) может достичь эффекта удаления акне.

Но вообще говоря, текущее приложение Meitu предоставит пользователям функцию ручного удаления прыщей, ведь как бы ни был хорош эффект автоматического отбеливания и удаления прыщей, идеально восстановить все лица невозможно, что представляется очень важным. .

По сути, удаление прыщей на лице – это, грубо говоря, восстановление имиджа. Функция исправления, предоставляемая в OpenCV, называется cv2.inpaint(). Здесь давайте взглянем на определение функции изменения:

def inpaint(src, inpaintMask, inpaintRadius, flags, dst=None):

источник: входное изображение

inpaintMask: исправить маску

inpaintRadius: радиус круглой области каждой точки, которую необходимо исправить, в качестве эталона для алгоритма восстановления.

flags: Метод восстановления, два значения. Значение INPAINT_NS основано на методе Навье-Стокса, INPAINT_TELEA основано на Александру Телеа.

dst: возвращает восстановленное изображение

Принцип этого метода заключается в использовании информации о границах области, подлежащей ремонту, и в то же время применяется метод оценки линии изоосвещенности от грубой до тонкой, а для распространения информации используется механизм распространения в область, подлежащую ремонту, чтобы добиться лучшего ремонта Эффект.

Перевод: используйте значение пикселя края, чтобы исправить пиксели в указанной области.

Реализовать ручное удаление прыщей на лице

Теперь, когда мы увидели функцию метода для ручного удаления прыщей. Далее, давайте достигнем эффекта ручного удаления прыщей, конкретный код выглядит следующим образом:

global img, point
global inpaintMask
#手动祛痘
def manual_acne(event, x, y, flags, param):
    global img, point
    img2 = img.copy()
    height, width, n = img.shape
    inpaintMask = np.zeros((height, width), dtype=np.uint8)
    if event == cv2.EVENT_LBUTTONDOWN:
        point = (x, y)
        cv2.circle(img2, point, 15, (0, 255, 0), -1)
        cv2.circle(inpaintMask, point, 15, 255, -1)
        cv2.imshow("image", img2)
    elif event == cv2.EVENT_LBUTTONUP:
        cv2.circle(img2, point, 15, (0, 255, 0), -1)
        cv2.circle(inpaintMask, point, 15, 255, -1)
        cv2.imshow("inpaintMask", inpaintMask)
        cv2.imshow("image", img2)
        cv2.imshow("image0", img)
        result = cv2.inpaint(img, inpaintMask, 100, cv2.INPAINT_TELEA)
        cv2.imshow("result", result)


if __name__ == "__main__":
    global img
    img = cv2.imread("60.jpg")
    cv2.namedWindow("image")
    cv2.setMouseCallback("image", manual_acne)
    cv2.imshow("image", img)
    cv2.waitKey()
    cv2.destroyAllWindows()

После запуска эффект следующий:

祛痘效果