Хотя ответа Paul92 более чем достаточно, я все равно хотел опубликовать свой код для любого будущего посетителя.
Я делаю обрезку, чтобы избавиться от белого фона на фотографиях некоторых продуктов. Итак, главная цель - избавиться от белого, сохранив при этом продукт в целости и сохранности. У большинства фотографий продукта есть тени на земле. Это либо сама земля (выцветшая), либо тень продукта, либо и то и другое.
Хотя обнаружение объекта работает нормально, эти тени также считаются частью объекта. Дифференцировать тени от объектов на самом деле не нужно, но это приводит к некоторым изображениям, которые не столь желательны. Например, изучите левую и нижнюю стороны изображения (тень). Срез / обрезка явно видны и выглядят не так хорошо.
Чтобы обойти эту проблему, я хотел делать непрямоугольные посевы. Использование масок, кажется, делает работу просто отлично. Следующая проблема состояла в том, чтобы сделать обрезку с заштрихованными / размытыми краями, чтобы я мог избавиться от этих видимых теней. С помощью справки из Пол92 мне удалось это сделать. Пример вывода (обратите внимание на отсутствующие тени, края более мягкие):
Операции с изображениями:
код ( show_mask_feserved.py , helpers_cv2.py )
import sys
from pathlib import Path
import cv2
import numpy
from helpers_cv2 import *
img_path = Path(sys.argv[1])
img = cmyk_to_bgr(str(img_path))
threshed = threshold(img, 240, type=cv2.THRESH_BINARY_INV)
contours = find_contours(threshed)
dilation_length = 51
blur_length = 51
mask = mask_from_contours(img, contours)
mask_dilated = dilate_mask(mask, dilation_length)
mask_smooth = smooth_mask(mask_dilated, odd(dilation_length * 1.5))
mask_blurred = cv2.GaussianBlur(mask_smooth, (blur_length, blur_length), 0)
mask_blurred = cv2.cvtColor(mask_blurred, cv2.COLOR_GRAY2BGR)
mask_threshed = threshold(mask_blurred, 1)
mask_contours = find_contours(mask_threshed)
mask_contour = max_contour(mask_contours)
x, y, w, h = cv2.boundingRect(mask_contour)
img_cropped = img[y:y+h, x:x+w]
mask_cropped = mask_blurred[y:y+h, x:x+w]
background = numpy.full(img_cropped.shape, (200,240,200), dtype=numpy.uint8)
output = alpha_blend(background, img_cropped, mask_cropped)