Удалить цвет за пределами круглой области изображения - PullRequest
1 голос
/ 17 июня 2020

Я использую следующий код для выполнения двух задач:

  1. Обрезка круглого глаза.
  2. Примените фильтр Гаусса.

Например: Когда входное изображение:

enter image description here

Приведенный ниже код генерирует:

enter image description here

Как видите, за пределами самого круглого глаза все еще есть серая область. Не знаю как убрать или превратить в белый цвет вместо серого. Любая помощь приветствуется.

import cv2
import numpy as np


def crop_from_gray(img):
    img_gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
    img_mask = img_gray > 5
    check_shape = img[:, :, 0][np.ix_(img_mask.any(1), img_mask.any(0))].shape[0]
    if check_shape == 0:
        # Image is too dark, just return to crop everything
        return img
    else:
        i1 = img[:, :, 0][np.ix_(img_mask.any(1), img_mask.any(0))]
        i2 = img[:, :, 1][np.ix_(img_mask.any(1), img_mask.any(0))]
        i3 = img[:, :, 2][np.ix_(img_mask.any(1), img_mask.any(0))]
        img = np.stack([i1, i2, i3], axis=-1)
    return img


def crop_filter(img, sigma):
    img = crop_from_gray(img)
    height, width, depth = img.shape
    x = int(width / 2)
    y = int(height / 2)
    r = np.amin((x, y))

    cir_img = np.zeros((height, width), np.uint8)
    cv2.circle(cir_img, (x, y), int(r), 1, thickness=-1)
    img = cv2.bitwise_and(img, img, mask=cir_img)
    img = crop_from_gray(img)

    # Filtering
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    gau = cv2.GaussianBlur(img, (0, 0), sigma)
    img = cv2.addWeighted(img, 4, gau, -4, 128)
    return img


img = cv2.imread('path/to/image')
img = crop_filter(img, 40)  # Crop and apply filter
img = cv2.resize(img, (128, 128))  # resize
cv2.imwrite('output_filepath', img)

1 Ответ

2 голосов
/ 17 июня 2020

Используйте для этой задачи исходное изображение, так как оно черное и различимое. Примените cv2.thresholding с очень низким пороговым значением и сделайте это с помощью cv2.THRESH_BINARY_INV.

Таким образом, область, которую вы хотите преобразовать в белый цвет, будет белой на исходном изображении, а область, которую вы хотите сохранить, будет черной. Теперь примените cv2.biwise_or между ними, и это должно сработать.

Если вы не можете это сделать, дайте мне знать, я напишу полный код.

...