Categories: Python

Python 使用 PIL.Image 疊合兩張影像教學與範例

介紹如何在 Python 中使用 PIL.Imageblend()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)
套用遮罩疊合影像

參考資料

Share
Published by
Office Guide

Recent Posts

Python 使用 PyAutoGUI 自動操作滑鼠與鍵盤

本篇介紹如何在 Python ...

1 年 ago

Ubuntu Linux 以 WireGuard 架設 VPN 伺服器教學與範例

本篇介紹如何在 Ubuntu ...

1 年 ago

Linux 網路設定 ip 指令用法教學與範例

本篇介紹如何在 Linux 系...

1 年 ago

Linux 以 Cryptsetup、LUKS 加密 USB 隨身碟教學與範例

介紹如何在 Linux 系統中...

1 年 ago