|
""" |
|
Source url: https://github.com/OPHoperHPO/image-background-remove-tool |
|
Author: Nikita Selin (OPHoperHPO)[https://github.com/OPHoperHPO]. |
|
License: Apache License 2.0 |
|
""" |
|
import cv2 |
|
import numpy as np |
|
from PIL import Image |
|
|
|
|
|
def prob_filter(mask: Image.Image, prob_threshold=231) -> Image.Image: |
|
""" |
|
Applies a filter to the mask by the probability of locating an object in the object area. |
|
|
|
Args: |
|
prob_threshold: Threshold of probability for mark area as background. |
|
mask: Predicted object mask |
|
|
|
Raises: |
|
ValueError if mask or trimap has wrong color mode |
|
|
|
Returns: |
|
Generated trimap for image. |
|
""" |
|
if mask.mode != "L": |
|
raise ValueError("Input mask has wrong color mode.") |
|
|
|
mask_array = np.array(mask) |
|
mask_array[mask_array > prob_threshold] = 255 |
|
mask_array[mask_array <= prob_threshold] = 0 |
|
return Image.fromarray(mask_array).convert("L") |
|
|
|
|
|
def prob_as_unknown_area( |
|
trimap: Image.Image, mask: Image.Image, prob_threshold=255 |
|
) -> Image.Image: |
|
""" |
|
Marks any uncertainty in the seg mask as an unknown region. |
|
|
|
Args: |
|
prob_threshold: Threshold of probability for mark area as unknown. |
|
trimap: Generated trimap. |
|
mask: Predicted object mask |
|
|
|
Raises: |
|
ValueError if mask or trimap has wrong color mode |
|
|
|
Returns: |
|
Generated trimap for image. |
|
""" |
|
if mask.mode != "L" or trimap.mode != "L": |
|
raise ValueError("Input mask has wrong color mode.") |
|
|
|
mask_array = np.array(mask) |
|
|
|
trimap_array = np.array(trimap) |
|
trimap_array[np.logical_and(mask_array <= prob_threshold, mask_array > 0)] = 127 |
|
return Image.fromarray(trimap_array).convert("L") |
|
|
|
|
|
def post_erosion(trimap: Image.Image, erosion_iters=1) -> Image.Image: |
|
""" |
|
Performs erosion on the mask and marks the resulting area as an unknown region. |
|
|
|
Args: |
|
erosion_iters: The number of iterations of erosion that |
|
the object's mask will be subjected to before forming an unknown area |
|
trimap: Generated trimap. |
|
mask: Predicted object mask |
|
|
|
Returns: |
|
Generated trimap for image. |
|
""" |
|
if trimap.mode != "L": |
|
raise ValueError("Input mask has wrong color mode.") |
|
|
|
trimap_array = np.array(trimap) |
|
if erosion_iters > 0: |
|
without_unknown_area = trimap_array.copy() |
|
without_unknown_area[without_unknown_area == 127] = 0 |
|
|
|
erosion_kernel = np.ones((3, 3), np.uint8) |
|
erode = cv2.erode( |
|
without_unknown_area, erosion_kernel, iterations=erosion_iters |
|
) |
|
erode = np.where(erode == 0, 0, without_unknown_area) |
|
trimap_array[np.logical_and(erode == 0, without_unknown_area > 0)] = 127 |
|
erode = trimap_array.copy() |
|
else: |
|
erode = trimap_array.copy() |
|
return Image.fromarray(erode).convert("L") |
|
|