Денойзинг сегментации карты изображения - PullRequest
1 голос
/ 18 октября 2019

Я обучил модель сегментации лица на наборе данных CelebA-Mask-HQ (https://github.com/switchablenorms/CelebAMask-HQ), которая способна создать отображение цветовой сегментации изображения с различными цветами для фона, глаз, лица, волоси т. д. Модель выдает массив фигур (1024,1024,3). Выводимые карты сегментации являются немного шумными, с некоторыми случайными пикселями на лице, помеченными, например, как глаза, или метками ткани, появляющимися, когда на самом деле это фон, см. Изображение ниже:

enter image description here

Как вы можете видеть на изображении, в верхнем левом углу вы видите зеленые пиксели, а на лице вокруг усов вы видите зеленые пиксели (над желтой верхней картой губ).

Я бы хотел убрать этот «шум» из карты сегментации, изменив эти неправильно помеченные маленькие сегменты на изображении, которые окружены большими правильно помеченными областями, автоматически на самый доминирующий цвет в этой области (с адаптируемым размером окна). Я не мог найти встроенную функциональность opencv для этого. Знаете ли вы какой-нибудь эффективный способ сделать это (мне нужно «убрать шум» с большого набора изображений, в идеале, векторизованным способом только для numpy)?

Очень важно, чтобы изображение после удаления шума только содержалонабор предопределенных цветов меток (всего 19 различных цветов), поэтому шум должен быть перекрашен абсолютно без усреднения (что привнесет новые цвета в цветовую палитру изображения).

Спасибо!

1 Ответ

1 голос
/ 18 октября 2019

Я могу указать вам от openCV на scikit-изображение, с которым я более знаком. Я бы решил это, используя подход, заимствованный из этого учебного пособия .

В частности, я бы сделал что-то вроде этого:

label_image = label(image)

for region in regionprops(label_image):
    # only recolor areas that are under a certain threshold size
    if region.area <= 100:
        #get creative with which color to recolor with...
        minr, minc, maxr, maxc = region.bbox
        colors = np.bincount(label_image[minr : maxr, minc:maxc])
        max_color = -1
        for i in range(len(colors)):
            if (colors[i] > max_color) and (i != region.label):
                max_color = colors[i]
        crop_image = label_image[minr : maxr, minc:maxc]
        label_image[minr : maxr, minc:maxc][crop_image == region.label] = max_color

Я не пробовал этот код... но я думаю, что-то подобное может сработать. Дайте мне знать, если это полезно или нет.

...