Проблема с фоном прозрачного .png формата OpenCV с Python - PullRequest
0 голосов
/ 19 ноября 2018

Я учусь на OpenCV с Python. Я пытался изменить цвет изображения в формате PNG, но у меня возникли проблемы с фоном PNG (изображение имеет прозрачный фон).

Когда я изменяю его на оттенки серого, фон меняется на черный - моя картинка больше не прозрачна. Я хочу сохранить прозрачный фон картинки.


Исходное изображение:

Мой код:

img = cv2.imread('line.png',cv2.IMREAD_UNCHANGED)
cv2.imshow('line',img)
cv2.waitKey()

Выходное изображение:

Желаемый выход:

Белый цвет вокруг границы изображения должен быть прозрачным. Как я могу это сделать?

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

Во-первых, позвольте мне упомянуть, что если вы отображаете изображение с альфа-прозрачностью, используя cv2.imshow, тогда прозрачные области будут черными.


Поскольку ваше входное изображение уже содержит альфа-канал,решение простое - просто повторно используйте альфа-канал.

Есть небольшая проблема - даже если формат PNG позволяет иметь оттенки серого с альфа-каналом, AFAIK нет способа написать такое изображение с OpenCV.

Поэтому решение простое: возьмите обработанное изображение в градациях серого, преобразуйте его обратно в BGR, добавьте оригинальный альфа-канал и сохраните результат.

Так как мы находимся в Python, и поэтомуизображение представлено в виде массива, мы можем использовать индексирование массива , чтобы извлечь нужные нам каналы.numpy.dstack позволяет легко добавлять альфа-канал.


Пример кода:

import cv2
import numpy as np

src = cv2.imread('51IgH.png', cv2.IMREAD_UNCHANGED)

bgr = src[:,:,:3] # Channels 0..2
gray = cv2.cvtColor(bgr, cv2.COLOR_BGR2GRAY)

# Some sort of processing...

bgr = cv2.cvtColor(gray, cv2.COLOR_GRAY2BGR)
alpha = src[:,:,3] # Channel 3
result = np.dstack([bgr, alpha]) # Add the alpha channel

cv2.imwrite('51IgH_result.png', result)

Результат:

Еще раз на другом фоне, чтобы вы могли видеть его действительно прозрачным:

0 голосов
/ 19 ноября 2018

Вы должны добавить четвертый канал в свой массив, чтобы информация о прозрачности могла быть закодирована в альфа-канале.

Вот пример кода Python:

import cv2
file_name = "source.png"

src = cv2.imread(file_name, cv2.IMREAD_UNCHANGED)

# Save the transparency channel alpha
*_, alpha = cv2.split(src)

gray_layer = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)

# ... Your image processing

# Duplicate the grayscale image to mimic the BGR image and finally add the transparency
dst = cv2.merge((gray_layer, gray_layer, gray_layer, alpha))
cv2.imwrite("result.png", dst)

Результат для серого изображения:

Grey image with transparency

Результат для изображения BGR:

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