使用 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 檔案。
資料結構
網路
關係型資料庫管理系統
作業系統
Java
iOS
HTML
CSS
Android
Python
C 語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP