Я использую следующий код для выполнения двух задач:
- Обрезка круглого глаза.
- Примените фильтр Гаусса.
Например: Когда входное изображение:
Приведенный ниже код генерирует:
Как видите, за пределами самого круглого глаза все еще есть серая область. Не знаю как убрать или превратить в белый цвет вместо серого. Любая помощь приветствуется.
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)