Как сохранить рисунки кистью, нарисованные поверх изображений, как заполненную и отдельную двоичную маску в opencv? - PullRequest
0 голосов
/ 02 октября 2018

В обучающих материалах openCV есть это обучающее руководство *1001* "мышь как кисть" , которое демонстрирует, как рисовать на изображении.Я знаю, как сохранить результат с помощью функции imwrite, но как сохранить только нарисованный и заполненный контур и сохранить его в виде черно-белой двоичной маски?

Во-первых, у меня есть изображение:

enter image description here

Далее я рисую на нем с помощью мыши, следуя за "мышью как кистью"" руководство.Что приводит к этому:

enter image description here

Нет, я хочу разделить исходное изображение и мой эскиз, чтобы получить это:

enter image description here

и это то, что я хочу сохранить в файл.

Нет кодов для загрузки, потому что маска (третье изображение), которая у меня есть сейчас, не получена из скетча.Это из аннотаций маски.Моя проблема сейчас заключается в том, как отделить эскиз пользователя как отдельный слой от исходного изображения?Я пытался искать ответы, но кажется, что в основном вместо объединения их используются только функции слияния.

Должен ли я использовать внешние библиотеки, такие как Cairo?Я пытаюсь сделать это в Python 3.5.Пожалуйста, сообщите, и любая помощь будет принята с благодарностью!

1 Ответ

0 голосов
/ 03 октября 2018

Обновлено снова

Вы абсолютно можете создать альфа-канал и добавить его к своему изображению.Это может выглядеть так:

# Split image into its three constituent channels, R, G and B
R, G, B = cv2.split(image)

# Make a same-shape alpha channel, initially opaque (255)
alpha   = np.ones_like(R)*255

# Merge R, G, B and alpha into a 4-channel image
imgwithalpha = cv2.merge((R, G, B, alpha))

Единственная проблема заключается в том, что OpenCV'S imshow() игнорирует альфа, а imwrite() учитывает альфу и сохраняет его на диск.Поэтому я бы нарисовал маску красным, как вы (чтобы пользователь мог ее видеть), но в то же время сохранил маску в черно-белом.Затем, в конце, объедините черно-белый в альфа-канал, как показано выше - черный, где вы хотите прозрачность, и белый, где вы хотите прозрачность.

Обновленный ответ

Итак, похоже, ваш код несколько отличается от примера кода OpenCV, и вы фактически загружаете другое изображение, а не черное, которое они используют.Неважно, сделайте черное изображение того же размера, что и ваша птица (используя numpy zeros_like(bird). Затем, когда вы рисуете на птице, нарисуйте этот же белый круг на черной копии. В конце используйте floodFill() с (0,0) в качестве семени, чтобы заполнить всю область за пределами птицы на черном изображении и сохранить его, как показано ниже.

Оригинальный ответ

Я не уверенЯ понимаю ваш вопрос, поэтому я отвечу на то, что, по вашему мнению, вы спрашиваете, и посмотрим, приведет ли это к правильному решению.

Код, на который вы ссылаетесь, создает пустой черный холст 512x512, например:

img = np.zeros((512,512,3), np.uint8)

Затем каждый раз, когда вы щелкаете мышью, на нем рисуются круги. Поэтому вам просто нужно сохранить это изображение перед выходом. Итак, добавьте его в качестве последней строки:

cv2.imwrite('mask.png',img)
...