使用OpenCV Python移除黑色背景并制作透明
在数字图像中,透明度是支持图像或图像层中的透明区域的功能。对于图像处理/图像编辑,移除背景可以帮助我们突出照片的主题,并创建一个透明的背景,将主题放入各种新设计和目的地中。
某些图像格式不支持透明度,例如TIFF、PNG和WebP图形格式支持透明度,而JPEG没有透明度。
本文中,我们将看到如何使用OpenCV Python移除图像的黑色背景并使其透明。与RGB通道类似,alpha通道用于存储透明度信息。
我们将按照以下步骤来移除黑色背景并使其透明。
方法
- 加载图像。
- 通过指定阈值值创建alpha通道。
- 拆分RGB通道。
- 合并RGB和alpha通道。
- 最后使用合并后的通道保存图像。
本文中主要使用的函数是cv2.split()和cv2.merge()函数,它们用于拆分和合并通道。
cv2.split()函数
Python的OpenCV模块提供了一个cv2.split()函数,用于将多通道/彩色数组拆分为单独的单通道数组。它将返回一个包含三个通道的数组,每个通道对应于蓝、绿和红通道,表示为具有两个维度的ndarray。以下是此函数的语法:
cv2.split(m[, mv])
参数
- src: 输入多通道数组。
-
mv: 输出数组或数组向量。
cv2.merge()函数
cv2.merge()函数将单通道数组合并成多通道数组/图像。此函数返回输入数组元素的连接数组。以下是该函数的语法-
cv2.merge(mv[, dst])
参数
- mv: 要合并的矩阵的输入向量。所有的矩阵必须具有相同的大小和深度。
-
count: 必须大于零。当输入向量为普通的C数组时,指定输入矩阵的数量。
-
dst: 输出数组,具有与输入数组相同的大小和深度。
示例
在这个示例中,我们将使用一张名为“flower-black-background.jpg”的图像作为输入以去除背景。
import cv2
src = cv2.imread('Images/flower-black-background.jpg', 1)
tmp = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)
_,alpha = cv2.threshold(tmp,0,255,cv2.THRESH_BINARY)
b, g, r = cv2.split(src)
rgba = [b,g,r, alpha]
dst = cv2.merge(rgba,4)
cv2.imwrite("Images/Background Transparent Image1.png", dst)
输入图像
输出图像
在输出中,我们可以看到图像文件夹中的透明图像“Background Transparent Image1.png”。由于我们的输入图像是以.jpg格式,所以我们通过添加 alpha 通道将其从 BGR 域转换为 BGRA 域。
示例
在这个示例中,我们将使用 numpy 函数移除 PNG 图像的黑色背景并使其透明。
import cv2
import numpy as np
# Load image
na = cv2.imread('Images/WhiteDots.png')
# Make a True/False mask of pixels whose BGR values sum to more than zero
alpha = np.sum(na, axis=-1) > 0
# Convert True/False to 0/255 and change type to "uint8" to match "na"
alpha = np.uint8(alpha * 255)
# Stack new alpha layer with existing image to go from BGR to BGRA, i.e. 3 channels to 4 channels
result = np.dstack((na, alpha))
# Save result
cv2.imwrite('result_image.png', result)
输入图像
输出图片
我们已成功将黑色像素转换为透明,并保存为 .png 文件。