Как добавить альфа-канал определенного значения в изображение BGR - PullRequest
0 голосов
/ 03 ноября 2019

Я попробовал приведенный ниже код, он не отображает никаких ошибок и работает правильно, но изменение значения альфа-канала не показывает никаких изменений в изображении

img3 = cv2.cvtColor(img2, cv2.COLOR_BGR2BGRA)
img3[:,:,3] = 100
cv2.imshow('img1',img2)    
cv2.imshow('img',img3)     
cv2.waitKey(0)

работает нормально, новыходные данные обоих изображений одинаковы, и после применения альфа-канала видимых изменений не наблюдается

я уже пробовал приведенный ниже код

1 Ответ

0 голосов
/ 04 ноября 2019

Ваш код на самом деле правильный.

Простой ответ заключается в том, что OpenCV imshow() игнорирует прозрачность, поэтому, если вы хотите увидеть его эффект, сохраните изображение в формате PNG / TIFF (оба из которых поддерживают прозрачность) и просмотрите его с помощью другого средства просмотра - например, GIMP , Photoshop или feh.

В качестве альтернативы я создал оболочку / декоратор для OpenCV imshow(), который отображает изображения с прозрачностью на шахматной доске, как это делает Photoshop. Итак, начиная с этого изображения RGBA Паддингтона и этого серого + альфа изображения Паддингтона:

enter image description here

enter image description here

#!/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

и это:

enter image description here

Ключевые слова : изображение, обработка изображений, Python, альфа-канал, прозрачность, наложение, шахматная доска, шахматная доска, смешивание, смешивание. OpenCV, imshow, cv2.imshow.

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