File size: 2,253 Bytes
0e83290
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
import cv2
import numpy as np


def merge_masks(masks, method='max'):
    if isinstance(masks, list):
        masks = np.array(masks)

    # Убедимся, что маски имеют корректную форму
    if len(masks.shape) != 3:
        raise ValueError(
            "Маски должны быть представлены в виде массива размерности (N, H, W)."
        )
    N, H, W = masks.shape

    # Создаем пустое цветное изображение
    mask_colored = np.zeros((H, W, 3), dtype=np.uint8)

    # Создаем список случайных цветов для каждой маски
    colors = [tuple(np.random.randint(0, 255, size=3)) for _ in range(N)]

    # Создаем уникальную индексированную маску
    unique_mask = np.zeros((H, W), dtype=np.uint8)

    for i in range(N):
        # Создаем цветную маску для текущей области
        color_mask = np.zeros_like(mask_colored)
        color_mask[masks[i] > 0] = colors[i]

        # Накладываем цветную маску на общее изображение
        mask_colored = cv2.addWeighted(mask_colored, 1, color_mask, 1, 0.0)

        # Присваиваем уникальные значения для текущей области в индексированной маске
        unique_mask[masks[i] > 0] = (
            i + 1
        )  # Используем i+1, чтобы избежать нулевого значения

    return mask_colored, unique_mask


def create_mask(mask, random_color=False):
    # Генерация цвета
    # if random_color:
    #     color = np.concatenate([np.random.random(3), np.array([0.6])], axis=0)
    # else:
    #     color = np.array(
    #         [30 / 255, 144 / 255, 255 / 255, 0.6]
    #     )  # Синий цвет с прозрачностью

    h, w = mask.shape[-2:]  # Получаем высоту и ширину маски
    mask = mask.astype(np.uint8)  # Приводим маску к типу uint8

    return mask  # Возвращаем маску в формате (H, W)