python將圖片透明背景轉(zhuǎn)為白色背景的兩種方法
方法一:使用OpenCV的函數(shù)封裝
安裝庫
pip install opencv-python
實(shí)現(xiàn)代碼
import cv2 import numpy as np def convert_transparent_to_white_opencv(input_image_path, output_image_path): """ 將透明背景的圖片轉(zhuǎn)換為白色背景,使用OpenCV實(shí)現(xiàn)。 參數(shù): input_image_path: str,輸入圖片的路徑 output_image_path: str,輸出圖片的路徑 返回: 無 """ # 讀取帶透明背景的圖片(假設(shè)圖片是PNG格式) img = cv2.imread(input_image_path, cv2.IMREAD_UNCHANGED) # 檢查是否讀取成功 if img is None: raise ValueError(f"Image at path {input_image_path} could not be read.") # 分離RGBA通道 b, g, r, a = cv2.split(img) # 創(chuàng)建一個(gè)與Alpha通道大小相同的全白背景 white_background = np.ones_like(a) * 255 # 將Alpha通道歸一化到0-1范圍 a = a / 255.0 # 按照Alpha通道的透明度混合原圖和白色背景 r = r * a + white_background * (1 - a) g = g * a + white_background * (1 - a) b = b * a + white_background * (1 - a) # 合并BGR通道 result = cv2.merge((b, g, r)) # 保存處理后的圖片 cv2.imwrite(output_image_path, result) # 示例調(diào)用 convert_transparent_to_white_opencv('input_image.png', 'output_image_opencv.png')
方法二:使用PIL的函數(shù)封裝
安裝庫
pip install pillow
完整代碼
from PIL import Image def convert_transparent_to_white_pil(input_image_path, output_image_path): """ 將透明背景的圖片轉(zhuǎn)換為白色背景,使用PIL實(shí)現(xiàn)。 參數(shù): input_image_path: str,輸入圖片的路徑 output_image_path: str,輸出圖片的路徑 返回: 無 """ # 讀取帶透明背景的圖片(假設(shè)圖片是PNG格式) img = Image.open(input_image_path).convert("RGBA") # 創(chuàng)建一個(gè)與原圖片大小相同的白色背景 white_background = Image.new("RGB", img.size, (255, 255, 255)) # 將原圖片粘貼到白色背景上,并使用Alpha通道作為掩碼 white_background.paste(img, (0, 0), img) # 保存處理后的圖片 white_background.save(output_image_path) # 示例調(diào)用 convert_transparent_to_white_pil('input_image.png', 'output_image_pil.png')
詳細(xì)解釋
OpenCV方法函數(shù)封裝
- 函數(shù)定義:定義一個(gè)函數(shù)convert_transparent_to_white_opencv,接受輸入圖片路徑和輸出圖片路徑作為參數(shù)。
- 讀取圖片:在函數(shù)內(nèi)部使用cv2.imread()讀取圖片,并進(jìn)行透明通道處理。
- 圖像處理:按之前的步驟進(jìn)行通道分離、創(chuàng)建白色背景、圖像合成。
- 保存圖片:將處理后的圖片保存到指定路徑。
PIL方法函數(shù)封裝
- 函數(shù)定義:定義一個(gè)函數(shù)convert_transparent_to_white_pil,接受輸入圖片路徑和輸出圖片路徑作為參數(shù)。
- 讀取圖片:在函數(shù)內(nèi)部使用Image.open()讀取圖片,并進(jìn)行透明通道處理。
- 圖像粘貼:按之前的步驟創(chuàng)建白色背景,將原圖粘貼到白色背景上。
- 保存圖片:將處理后的圖片保存到指定路徑。
通過上述封裝函數(shù),可以更方便地將帶透明背景的圖片轉(zhuǎn)換為白色背景的圖片。
可以將帶透明背景的圖片轉(zhuǎn)換為任意顏色背景的圖片,并在任意顏色背景之間進(jìn)行轉(zhuǎn)換。以下是使用OpenCV和PIL的方法,并進(jìn)行了函數(shù)封裝,允許用戶指定任意背景顏色。
1, 使用OpenCV的函數(shù)封裝
import cv2 import numpy as np def convert_transparent_to_color_opencv(input_image_path, output_image_path, bg_color=(255, 255, 255)): """ 將透明背景的圖片轉(zhuǎn)換為任意顏色背景,使用OpenCV實(shí)現(xiàn)。 參數(shù): input_image_path: str,輸入圖片的路徑 output_image_path: str,輸出圖片的路徑 bg_color: tuple,背景顏色(默認(rèn)為白色 (255, 255, 255)) 返回: 無 """ # 讀取帶透明背景的圖片(假設(shè)圖片是PNG格式) img = cv2.imread(input_image_path, cv2.IMREAD_UNCHANGED) # 檢查是否讀取成功 if img is None: raise ValueError(f"Image at path {input_image_path} could not be read.") # 分離RGBA通道 b, g, r, a = cv2.split(img) # 創(chuàng)建一個(gè)與Alpha通道大小相同的指定顏色背景 background = np.ones_like(a) * np.array(bg_color[::-1], dtype=np.uint8)[:, None, None] # 將Alpha通道歸一化到0-1范圍 a = a / 255.0 # 按照Alpha通道的透明度混合原圖和背景 r = r * a + background[0] * (1 - a) g = g * a + background[1] * (1 - a) b = b * a + background[2] * (1 - a) # 合并BGR通道 result = cv2.merge((b, g, r)) # 保存處理后的圖片 cv2.imwrite(output_image_path, result) # 示例調(diào)用 convert_transparent_to_color_opencv('input_image.png', 'output_image_opencv.png', bg_color=(0, 128, 255))
2, 使用PIL的函數(shù)封裝
from PIL import Image def convert_transparent_to_color_pil(input_image_path, output_image_path, bg_color=(255, 255, 255)): """ 將透明背景的圖片轉(zhuǎn)換為任意顏色背景,使用PIL實(shí)現(xiàn)。 參數(shù): input_image_path: str,輸入圖片的路徑 output_image_path: str,輸出圖片的路徑 bg_color: tuple,背景顏色(默認(rèn)為白色 (255, 255, 255)) 返回: 無 """ # 讀取帶透明背景的圖片(假設(shè)圖片是PNG格式) img = Image.open(input_image_path).convert("RGBA") # 創(chuàng)建一個(gè)與原圖片大小相同的指定顏色背景圖像 background = Image.new("RGB", img.size, bg_color) # 將原圖片粘貼到指定顏色背景上,并使用透明度作為掩碼 background.paste(img, (0, 0), img) # 保存處理后的圖片 background.save(output_image_path) # 示例調(diào)用 convert_transparent_to_color_pil('input_image.png', 'output_image_pil.png', bg_color=(0, 128, 255))
詳細(xì)解釋
1.OpenCV方法函數(shù)封裝
- 函數(shù)定義:定義一個(gè)函數(shù)convert_transparent_to_color_opencv,接受輸入圖片路徑、輸出圖片路徑和背景顏色作為參數(shù)。
- 讀取圖片:在函數(shù)內(nèi)部使用cv2.imread()讀取帶有透明背景的圖片,并進(jìn)行透明通道處理。
- 檢查是否讀取成功:確保圖片成功讀取,否則拋出異常。
- 分離RGBA通道:使用cv2.split()將圖片分離為四個(gè)通道(RGBA)。
- 創(chuàng)建背景:創(chuàng)建一個(gè)與Alpha通道大小相同的指定顏色背景,顏色轉(zhuǎn)換為BGR順序以符合OpenCV的顏色順序。
- 圖像合成:將Alpha通道歸一化到0-1范圍,并按照Alpha通道的透明度混合原圖和背景。
- 合并通道并保存圖片:合并BGR通道,并保存處理后的圖片。
2.PIL方法函數(shù)封裝
- 函數(shù)定義:定義一個(gè)函數(shù)convert_transparent_to_color_pil,接受輸入圖片路徑、輸出圖片路徑和背景顏色作為參數(shù)。
- 讀取圖片:在函數(shù)內(nèi)部使用Image.open()讀取帶有透明背景的圖片,并轉(zhuǎn)換為RGBA模式。
- 創(chuàng)建背景:創(chuàng)建一個(gè)與原圖片大小相同的指定顏色背景圖像。
- 圖像粘貼:使用paste()方法將原圖粘貼到背景上,并使用透明度作為掩碼。
- 保存圖片:保存處理后的圖片。
這兩種方法都可以將透明背景轉(zhuǎn)換為任意顏色背景,并支持在任意顏色背景之間進(jìn)行轉(zhuǎn)換??梢愿鶕?jù)具體需求選擇合適的工具和方法。
使用OpenCV將圖片透明背景添加稍微大一點(diǎn)的白色背景
import cv2 import numpy as np def add_white_background_with_padding_opencv(input_image_path, output_image_path, padding=10): """ 將透明背景的圖片轉(zhuǎn)換為帶有稍微大一點(diǎn)的白色背景的圖片,使用OpenCV實(shí)現(xiàn)。 參數(shù): input_image_path: str,輸入圖片的路徑 output_image_path: str,輸出圖片的路徑 padding: int,背景的擴(kuò)展大?。J(rèn)為10像素) 返回: 無 """ # 讀取帶透明背景的圖片(假設(shè)圖片是PNG格式) img = cv2.imread(input_image_path, cv2.IMREAD_UNCHANGED) # 檢查是否讀取成功 if img is None: raise ValueError(f"Image at path {input_image_path} could not be read.") # 分離RGBA通道 b, g, r, a = cv2.split(img) # 獲取原圖片的尺寸 height, width = a.shape # 創(chuàng)建一個(gè)稍微大一點(diǎn)的白色背景 new_height = height + 2 * padding new_width = width + 2 * padding white_background = np.ones((new_height, new_width, 3), dtype=np.uint8) * 255 # 將Alpha通道歸一化到0-1范圍 a = a / 255.0 # 創(chuàng)建一個(gè)新的RGBA圖像并將原圖像放到中央 result = np.zeros((new_height, new_width, 3), dtype=np.uint8) for c in range(3): result[padding:padding + height, padding:padding + width, c] = img[:, :, c] * a + white_background[padding:padding + height, padding:padding + width, c] * (1 - a) # 保存處理后的圖片 cv2.imwrite(output_image_path, result) # 示例調(diào)用 add_white_background_with_padding_opencv('input_image.png', 'output_image_with_padding.png', padding=20)
詳細(xì)解釋
- 函數(shù)定義:定義一個(gè)函數(shù)add_white_background_with_padding_opencv,接受輸入圖片路徑、輸出圖片路徑和背景擴(kuò)展大小作為參數(shù)。
- 讀取圖片:使用cv2.imread()讀取帶有透明背景的圖片,并指定cv2.IMREAD_UNCHANGED以確保讀取透明通道(Alpha通道)。
- 檢查是否讀取成功:確保圖片成功讀取,否則拋出異常。
- 分離RGBA通道:使用cv2.split()將圖片分離為四個(gè)通道(RGBA)。
- 獲取原圖片尺寸:獲取原圖片的高度和寬度。
- 創(chuàng)建白色背景:創(chuàng)建一個(gè)稍微大一點(diǎn)的白色背景,背景大小為原圖片大小加上兩倍的擴(kuò)展大小。
- 將Alpha通道歸一化:將Alpha通道的值歸一化到0-1范圍。
- 圖像合成:創(chuàng)建一個(gè)新的圖像,并將原圖像放到中央,同時(shí)根據(jù)Alpha通道的透明度混合原圖和白色背景。
保存處理后的圖片:將處理后的圖片保存到指定路徑。
通過這種方法,可以將帶透明背景的圖片轉(zhuǎn)換為帶有稍微大一點(diǎn)白色背景的圖片。
以上就是python將圖片透明背景轉(zhuǎn)為白色背景的兩種方法的詳細(xì)內(nèi)容,更多關(guān)于python圖片背景轉(zhuǎn)換的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python3中編碼與解碼之Unicode與bytes的講解
今天小編就為大家分享一篇關(guān)于Python3中編碼與解碼之Unicode與bytes的講解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-02-02Python中LSTM回歸神經(jīng)網(wǎng)絡(luò)時(shí)間序列預(yù)測(cè)詳情
這篇文章主要介紹了Python中LSTM回歸神經(jīng)網(wǎng)絡(luò)時(shí)間序列預(yù)測(cè)詳情,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下2022-07-07python實(shí)現(xiàn)字典合并的五種方法(附示例代碼)
在Python中,有多種方法可以通過使用各種函數(shù)和構(gòu)造函數(shù)來合并字典,在本文中,我們將討論一些合并字典的方法,并通過代碼示例講解的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下2024-04-04Python中optionParser模塊的使用方法實(shí)例教程
這篇文章主要介紹了Python中optionParser模塊的使用方法,功能非常強(qiáng)大,需要的朋友可以參考下2014-08-08如何使用?Python?實(shí)現(xiàn)?DeepSeek?R1?本地化部署
文章介紹了如何使用Python實(shí)現(xiàn)DeepSeekR1本地化部署,包括硬件環(huán)境、Python環(huán)境、安裝依賴包、配置與運(yùn)行代碼等步驟,幫助讀者輕松部署并運(yùn)行本地AI助手,感興趣的朋友一起看看吧2025-02-02