Как сделать изображение jpg полупрозрачным? - PullRequest
3 голосов
/ 31 октября 2019

Я хочу установить альфа-канал на изображение .jpg и установить его значение на 0,5 или 50% или на 128 (от 0 до 1 общего диапазона или 0-255 диапазона) и сохранить его как .png, используя только opencv и numpy. Я знаю, как это сделать, используя другие библиотеки, но нас попросили выполнить вышеупомянутый вопрос, используя только две библиотеки, т.е. import cv2 и import numpy. Я добавил альфа-канал, но я не знаю, как установить его значение на 50% прозрачности, пожалуйста, помогите, поскольку я новичок в opencv-python.

Я пробовал этот код, но я получаю черное изображениедаже когда я открываю его краской.

Уменьшаем непрозрачность изображения, используя Opencv в Python

, вот как я добавил свою альфу

import cv2
import numpy as np
img = cv2.imread('food.jpg')
bgra = cv2.cvtColor(img, cv2.COLOR_BGR2BGRA)
print(bgra.shape)

1 Ответ

5 голосов
/ 31 октября 2019

Есть несколько способов сделать это ... Я начну с этого изображения:

enter image description here


Добавить пустой альфа-канал с помощьюОткройте 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


В качестве альтернативы создайте сплошной альфа-слой, заполненный 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

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