Рисование контуров OpenCV и сохранение как прозрачное изображение - PullRequest
0 голосов
/ 03 августа 2020

Я пытаюсь нарисовать контуры, которые нашел с помощью findContours.

Если я рисую вот так, я получаю черный фон с нарисованным на нем контуром.

    out = np.zeros_like(someimage)
    cv2.drawContours(out, contours, -1, 255, 1)
    cv2.imwrite('contours.png',out)

Если Я рисую вот так, получаю полностью прозрачное изображение без нарисованных контуров.

    out = np.zeros((55, 55, 4), dtype=np.uint8)
    cv2.drawContours(out, contours, -1, 255, 1)
    cv2.imwrite('contours.png',out)

Как мне go сделать изображение с размером (55,55) и нарисовать на нем контур, пока сохранить прозрачный фон?

Спасибо

Ответы [ 3 ]

2 голосов
/ 03 августа 2020

Для работы с прозрачными изображениями в OpenCV вам необходимо использовать четвертый канал после BGR, который называется альфа с элементами управления. Поэтому вместо создания трехканального изображения создайте изображение с четырьмя каналами, а также при рисовании убедитесь, что вы присвоили четвертому каналу значение 255.

mask = np.zeros((55, 55, 4), dtype=np.uint8)
cv2.drawContours(mask, cnts, -1, (255, 255, 255, 255), 1) #change first three channels to any color you want.
cv2.imwrite('res.png', mask)

INput

Input image whose contours to draw.

результат

Результат

2 голосов
/ 03 августа 2020

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

Ввод:

enter image description here

import cv2
import numpy as np

# read image
img = cv2.imread('mask.png')

# convert to gray
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

out = cv2.cvtColor(gray, cv2.COLOR_GRAY2BGRA)
out[:,:,3] = gray

# write output
cv2.imwrite('mask_transp.png',out)

# display it
cv2.imshow("out", out)
cv2.waitKey(0)

Transparent result (download to see it since it is white on transparent background):

введите описание изображения здесь

2 голосов
/ 03 августа 2020

В Python / OpenCV используйте черно-белое изображение в качестве альфа-канала, а также используйте его для 3-канального изображения BGR.

cntr_img = np.zeros((55, 55, 4), dtype=np.uint8)
cv2.drawContours(cntr_img, contours, -1, 255, 1)
out = cv2.cvtColor(cntr_img, cv2.COLOR_GRAY2BGRA)
out[:,:,3] = cntr_img
cv2.imwrite('contours.png',out)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...