Есть несколько способов сделать это ... Я начну с этого изображения:
![enter image description here](https://i.stack.imgur.com/OnPwL.jpg)
Добавить пустой альфа-канал с помощьюОткройте OpenCV и установите содержимое с помощью индексации Numpy:
import cv2
import numpy as np
img = cv2.imread('paddington.jpg')
# Add alpha layer with OpenCV
bgra = cv2.cvtColor(img, cv2.COLOR_BGR2BGRA)
# Set alpha layer semi-transparent with Numpy indexing, B=0, G=1, R=2, A=3
bgra[...,3] = 127
# Save result
cv2.imwrite('result.png',bgra)
![enter image description here](https://i.stack.imgur.com/4rr0T.png)
В качестве альтернативы создайте сплошной альфа-слой, заполненный 128 с, и суммируйте по глубинес Numpy dstack()
:
import cv2
import numpy as np
img = cv2.imread('paddington.jpg')
# Create solid alpha layer, same height and width as "img", filled with 128s
alpha = np.zeros([img.shape[0],img.shape[1],1], dtype=np.uint8) + 128
# Depth-wise stack that layer onto existing 3 RGB layers
bgra = np.dstack((img,alpha))
# Save result
cv2.imwrite('result.png',bgra)
Либо создайте сплошной альфа-слой, заполненный 128 с, и объедините, используя OpenCV merge()
:
import cv2
import numpy as np
img = cv2.imread('paddington.jpg')
# Create solid alpha layer, same height and width as "img", filled with 128s
alpha = np.full_like(img[...,0], 128)
# Merge new alpha layer onto image with OpenCV "merge()"
bgra = cv2.merge((img,alpha))
# Save result
cv2.imwrite('result.png',bgra)
Обратите внимание, чтоКак и ожидалось, метод OpenCV cvtColor()
, описанный первым, является самым быстрым, примерно в 10 раз, потому что это SIMD-код, оптимизированный вручную. Синхронизация с данным изображением была следующей:
cv2.cvtColor()
- 48 микросекунд np.dstack()
- 477 микросекунд cv2.merge()
- 489 микросекунд
Ключевые слова : Python, изображение, обработка изображений, Numpy, OpenCV, dstack, слияние, cvtColor, добавить альфа-канал, добавить прозрачность, установить прозрачность, COLOR_BGR2BGRA, cv.COLOR_BGR2BGRA