Ваш код на самом деле правильный.
Простой ответ заключается в том, что OpenCV imshow()
игнорирует прозрачность, поэтому, если вы хотите увидеть его эффект, сохраните изображение в формате PNG / TIFF (оба из которых поддерживают прозрачность) и просмотрите его с помощью другого средства просмотра - например, GIMP , Photoshop или feh
.
В качестве альтернативы я создал оболочку / декоратор для OpenCV imshow()
, который отображает изображения с прозрачностью на шахматной доске, как это делает Photoshop. Итак, начиная с этого изображения RGBA Паддингтона и этого серого + альфа изображения Паддингтона:
![enter image description here](https://i.stack.imgur.com/j974y.png)
![enter image description here](https://i.stack.imgur.com/LC1Q4.png)
#!/usr/bin/env python3
import cv2
import numpy as np
def imshow(title,im):
"""Decorator for OpenCV "imshow()" to handle images with transparency"""
# Check we got np.uint8, 2-channel (grey + alpha) or 4-channel RGBA image
if (im.dtype == np.uint8) and (len(im.shape)==3) and (im.shape[2] in set([2,4])):
# Pick up the alpha channel and delete from original
alpha = im[...,-1]/255.0
im = np.delete(im, -1, -1)
# Promote greyscale image to RGB to make coding simpler
if len(im.shape) == 2:
im = np.stack((im,im,im))
h, w, _ = im.shape
# Make a checkerboard background image same size, dark squares are grey(102), light squares are grey(152)
f = lambda i, j: 102 + 50*((i+j)%2)
bg = np.fromfunction(np.vectorize(f), (16,16)).astype(np.uint8)
# Resize to square same length as longer side (so squares stay square), then trim
if h>w:
longer = h
else:
longer = w
bg = cv2.resize(bg, (longer,longer), interpolation=cv2.INTER_NEAREST)
# Trim to correct size
bg = bg[:h,:w]
# Blend, using result = alpha*overlay + (1-alpha)*background
im = (alpha[...,None] * im + (1.0-alpha[...,None])*bg[...,None]).astype(np.uint8)
cv2.imshow(title,im)
if __name__ == "__main__":
# Open RGBA image
im = cv2.imread('paddington.png',cv2.IMREAD_UNCHANGED)
imshow("Paddington (RGBA)",im)
key = cv2.waitKey(0)
cv2.destroyAllWindows()
# Open Grey + alpha image
im = cv2.imread('paddington-ga.png',cv2.IMREAD_UNCHANGED)
imshow("Paddington (grey + alpha)",im)
key = cv2.waitKey(0)
cv2.destroyAllWindows()
И вы получите это:
![enter image description here](https://i.stack.imgur.com/atO4e.jpg)
и это:
![enter image description here](https://i.stack.imgur.com/fsldF.png)
Ключевые слова : изображение, обработка изображений, Python, альфа-канал, прозрачность, наложение, шахматная доска, шахматная доска, смешивание, смешивание. OpenCV, imshow, cv2.imshow.