Как преобразовать черные части изображения RGBA в прозрачные в opencv - PullRequest
1 голос
/ 05 апреля 2020

У меня есть изображение в формате rgba с (0,0,0) черным в нем, и я хочу преобразовать каждый из этих (0,0,0) пикселей в прозрачный. Изображение уже имеет альфа-канал, и я не знаю, как активировать альфа-канал для пикселя. Я попытался установить значение альфа-канала на 0, но пока он не работал:

        for y in range(len(blur)):
            for x in range(len(blur[0])):
                if blur[y][x][0] == 0 and blur[y][x][1] == 0 and blur[y][x][2] == 0:
                    blur[y][x][3] = 0

Также, как я могу оптимизировать это для l oop, используя вместо этого numpy?

1 Ответ

1 голос
/ 05 апреля 2020

Это может быть просто отображение проблемы, но это трудно понять из вашего примера кода.

cv2.imshow не поддерживает прозрачность.
Сохраните результат в файл изображения PNG и просмотрите изображение с помощью средства просмотра, которое показывает прозрачность. (используя GIMP или paint.net, легко просматривать прозрачные пиксели).

Приведенный ниже пример кода выполняет следующие действия:

  • Загружает изображение RGB и dr aws черный текст на изображении (загрузка изображения в виде BGR).
  • Преобразование изображение в BGRA.
  • Устанавливает значение альфа-канала всех обратных пикселей на ноль (ноль прозрачен, а 255 непрозрачен).
    Код использует логическое индексирование вместо использования для l oop.
  • Сохраняет изображение BGRA в файл изображения PNG.

Вот код:

import cv2
import numpy as np

# Read image in BGR format
img = cv2.imread('chelsea.png')

# Write cat in in black color
cv2.putText(img, 'cat', (img.shape[1]//2-85*len('cat'), img.shape[0]//2+100), cv2.FONT_HERSHEY_DUPLEX, 10, (0, 0, 0), 20)

# Coinvert from BGR to BGRA
bgra = cv2.cvtColor(img, cv2.COLOR_BGR2BGRA)

# Slice of alpha channel
alpha = bgra[:, :, 3]

# Use logical indexing to set alpha channel to 0 where BGR=0
alpha[np.all(bgra[:, :, 0:3] == (0, 0, 0), 2)] = 0

# Save bgra to PNG file
cv2.imwrite('bgra.png', bgra)

# Show image for testing
cv2.imshow('img', img)
cv2.imshow('bgra', bgra) # The letters are black, because cv2.imshow does not support transparency.
cv2.imshow('bgra[:,:,3]', bgra[:,:,3])
cv2.waitKey(0)
cv2.destroyAllWindows()

Результат:

bgra.png file:
enter image description here

Фон сайта белый, поэтому прозрачные пиксели белые ...

...