如何使jpg图像半透明?

时间:2019-10-31 07:20:06

标签: python opencv

我想将alpha通道设置为.jpg图像,并将其值设置为0.5或50%或128(总范围为0到1或0-255范围),并仅使用opencv和numpy将其保存为.png。我知道如何使用其他库来执行此操作,但是我们被要求仅使用两个库即导入cv2和导入numpy来执行上述问题。 我已经添加了Alpha通道,但我不知道如何将其值设置为50%的透明度,因为我是opencv-python的新手,请提供帮助。

我已经尝试过此代码,但是即使用油漆打开它也会得到黑色图像。

Reduce opacity of image using Opencv in Python

这就是我添加Alpha的方式

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

1 个答案:

答案 0 :(得分:5)

执行此操作的方法有多种...我将从这张图片开始:

enter image description here


使用OpenCV添加空白Alpha通道,并使用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的实心Alpha层,并使用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的实心alpha图层,然后使用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()方法最快,是手工优化的SIMD代码的十倍。具有给定图像的时间如下:

  • cv2.cvtColor()-48微秒
  • np.dstack()-477微秒
  • cv2.merge()-489微秒

关键字:Python,图像,图像处理,Numpy,OpenCV,dstack,merge,cvtColor,添加Alpha通道,添加透明度,设置透明度,COLOR_BGR2BGRA,cv.COLOR_BGR2BGRA