介紹如何在 Python 中使用 PIL.Image 的 blend() 或 composite() 函數以半透明的方式合併兩張影像。
如果要將兩張影像重疊起來,將兩張影像變成半透明之後合併起來,可以使用 PIL.Image.blend() 函數來處理,以下是處理的步驟。
測試用圖片
以下是本文中用來測試的兩張圖片。


更改影像大小
在合併之前,必須先確認兩張影像的大小都是一致的。
from PIL import Image
# 載入兩張影像
img1 = Image.open("image1.jpg")
img2 = Image.open("image2.jpg")
# 檢查兩張影像大小是否一致
print(img1.size)
print(img2.size)
(720, 480) (720, 480)
如果兩張影像大小不同,可以考慮使用 resize() 調整影像大小:
# 指定目標圖片大小
imgSize = (720, 480)
# 改變影像大小
img1.resize(imgSize)
img2.resize(imgSize)
另一種方式是採用 crop() 函數將兩張影像裁切成相同的大小:
# 指定裁切大小
cropBox = (
0, # left
0, # upper
720, # right
480 # lower
)
# 裁切影像
img1.crop(cropBox)
img2.crop(cropBox)
疊合影像
準備好兩張相同大小的影像之後,即可使用 blend() 函數進行影像的疊合,而在疊合影像時要指定一個 alpha 值(代表透明度),blend() 函數會依照以下公式進行影像的疊合:
out = image1 * (1.0 - alpha) + image2 * alpha
以下是 alpha 指定為 0.5 的範例:
# 疊合影像
blendImg = Image.blend(img1, img2, alpha = 0.5)
# 顯示影像
blendImg.show()

不同的 alpha 值會有不同的效果:
# 疊合影像
blendImg = Image.blend(img1, img2, alpha = 0.3)
# 顯示影像
blendImg.show()

遮罩疊合影像
若要搭配遮罩來疊合兩張影像,可以再另外準備好遮罩之後,改用 composite() 函數來處理。遮罩影像的格式可以是黑白圖片("1")、灰階圖片("L")或含透明度的彩色圖片("RGBA"),以下是產生遮罩的範例:
from PIL import ImageDraw, ImageFilter
# 產生遮罩影像
maskImg = Image.new("L", (720, 480))
# 繪製遮罩區域
maskDraw = ImageDraw.Draw(maskImg)
maskDraw.ellipse((50, 50, 470, 430), fill=255)
# 模糊化
maskImg = maskImg.filter(ImageFilter.GaussianBlur(30))
# 顯示遮罩影像
maskImg.show()

有了遮罩影像之後,即可使用 composite() 函數套用遮罩疊合影像:
# 套用遮罩疊合影像
Image.composite(img1, img2, maskImg)

