Как сгруппировать части маски в изображении с помощью Python?

Мне нужно разделить маску таким образом, чтобы в случае несоответствия внутри маски она была разделена. Например, если я рисую маску кошки, я хочу, чтобы широкая часть (тело) была одной маской, а узкая часть (хвост) — другой.

Сейчас у меня есть сплошная маска, включающая в себя как тело кошки, так и ее хвост. Я хочу разделить это на две отдельные маски. Как я могу добиться этого с помощью Python?

оригинальная маска Как сгруппировать части маски в изображении с помощью Python?

желаемая маска

Как сгруппировать части маски в изображении с помощью Python?

Я рассмотрел использование методов, описанных в этом, в которых основное внимание уделяется разбиению многоугольников и разделению контуров на несколько треугольников. Однако этот подход не соответствует моим потребностям, поскольку я хочу разделить маску по размеру и форме, а не создавать несколько треугольных разделов.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать Дефекты выпуклости, чтобы определить точки, между которыми нужно «разрезать».

Это делается так здесь например.

import cv2
import matplotlib.pyplot as plt
import numpy as np

def split_mask(mask):
    _, thresh = cv2.threshold(mask , 120,255, cv2.THRESH_BINARY)
    contours, _ = cv2.findContours(thresh, 2, 1)

    for contour in contours:
        if  cv2.contourArea(contour) > 20:
            hull = cv2.convexHull(contour, returnPoints = False)
            defects = cv2.convexityDefects(contour, hull)
            if defects is None:
                continue
            
            # Gather all defect points to filter them.
            dd = [e[0][3]/256 for e in defects]
            points = []
            for i in range(len(dd)):
                _,_,f,_ = defects[i,0]
                if dd[i] > 1.0 and dd[i]/np.max(dd) > 0.2:
                    points.append(f)

            # If there is defect points, erase the mask closest points.
            if len(points) >= 2:
                for i, f1 in enumerate(points):
                    p1 = tuple(contour[f1][0])
                    nearest = min((tuple(contour[f2][0]) for j, f2 in enumerate(points) if i != j),
                                  key=lambda p2: (p1[0] - p2[0])**2 + (p1[1] - p2[1])**2)
                    cv2.line(thresh, p1, nearest, 0, 20)
    return thresh    

if __name__= = "__main__":
    mask = cv2.imread("<path-to-your-image>", cv2.IMREAD_GRAYSCALE)
    mask_splitted = split_mask(mask)
    plt.imshow(mask_splitted)
    plt.show()

Это даст следующее на вашем изображении:

Другие вопросы по теме

Похожие вопросы

Как подсчитать длину строки в Python (если строка содержит экранирование символов)?
Как мне найти максимальное значение динамического окна и минимальное значение ниже него?
Как изменить цвет определенного слова пользователя в «input()»
C-расширение Python с numpy случайно аварийно завершает работу после нескольких вызовов (5–10) из кода Python
Создайте фабрику виджетов в Qt
Почему GEKKO не предоставляет оптимальные команды, хотя выходные данные не соответствуют эталонным?
Java sshtools сгенерировал подпись EDDSA, не совпадающую с сгенерированной подписью пикриптома Python
Как записать атрибуты каждого экземпляра в переменную класса, при этом родительский класс записывает экземпляры всех классов в одну и ту же переменную?
Создание динамического массива numpy с использованием двух существующих массивов
Функция C++ возвращает результат очень медленно, намного медленнее, чем функционально эквивалентный код Python