使用 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)

输入图像

输出图像

在输出中,我们可以在 images 文件夹中看到透明图像“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 文件。

更新于:2023年5月30日

3K+ 浏览量

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告