Во-первых, позвольте мне упомянуть, что если вы отображаете изображение с альфа-прозрачностью, используя 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)
Результат:
Еще раз на другом фоне, чтобы вы могли видеть его действительно прозрачным: