Pillow 是一套功能豐富的 Python 影像處理函式庫,提供操作影像的各種方法,從基本的裁剪、縮放、旋轉到進階的顏色操作和水印新增等,都能輕鬆實作。本文將詳細介紹 Pillow 的常用功能,並結合 Matplotlib 進行圖表整合,示範如何運用 Python 進行影像處理和視覺化。同時,文章也涵蓋 RGBA 顏色模型的應用,以及如何使用 ImageColor.getcolor() 函式取得顏色值。最後,將示範如何批次處理影像,例如為多個影像新增水印,並結合實際案例講解如何使用 Pillow 進行影像的裁剪、拼接和平鋪等操作。
影像處理與自動化
Pillow影像處理函式庫
Pillow是一個強大的Python影像處理函式庫,允許您輕鬆地編輯和操作影像。您可以使用Pillow進行影像裁剪、調整大小和編輯內容等操作。
安裝Pillow
您可以使用pip安裝Pillow:
pip install pillow
基本影像操作
Pillow提供了許多基本的影像操作功能,例如:
- 裁剪:
image.crop() - 調整大小:
image.resize() - 旋轉:
image.rotate() - 翻轉:
image.transpose()
RGBA顏色值
Pillow使用RGBA顏色值來表示影像中的顏色。RGBA值由四個整陣列成,分別表示紅、綠、藍和透明度。每個值的範圍是0至255。
顏色名稱
Pillow支援標準的HTML顏色名稱。以下是部分顏色名稱及其對應的RGBA值:
| 顏色名稱 | RGBA值 |
|---|---|
| 白色 | (255, 255, 255, 255) |
| 黑色 | (0, 0, 0, 255) |
| 紅色 | (255, 0, 0, 255) |
| 綠色 | (0, 255, 0, 255) |
| 藍色 | (0, 0, 255, 255) |
Matplotlib圖表函式庫
Matplotlib是一個流行的Python圖表函式庫,允許您建立高品質的圖表。Matplotlib提供了許多自定義選項和功能,讓您可以建立出符合您需求的圖表。
基本圖表操作
Matplotlib提供了許多基本的圖表操作功能,例如:
- 建立圖表:
matplotlib.pyplot.plot() - 設定標題:
matplotlib.pyplot.title() - 設定軸標籤:
matplotlib.pyplot.xlabel()和matplotlib.pyplot.ylabel()
圖表翻譯:
此圖示為Matplotlib建立的基本圖表,展示瞭如何使用Matplotlib建立一個簡單的圖表。
內容解密:
此段程式碼展示瞭如何使用Matplotlib建立一個簡單的圖表。首先,我們建立一個圖表物件,然後設定標題和軸標籤。最後,我們顯示出圖表。
import matplotlib.pyplot as plt
# 建立圖表
plt.plot([1, 2, 3])
# 設定標題
plt.title('簡單圖表')
# 設定軸標籤
plt.xlabel('X軸')
plt.ylabel('Y軸')
# 顯示圖表
plt.show()
顏色表示法
在 Pillow 中,顏色可以使用 RGBA 值表示,分別代表紅(Red)、綠(Green)、藍(Blue)和透明度(Alpha)。每個值的範圍從 0 到 255。
基本顏色
以下是基本顏色的 RGBA 值:
- 紅色:(255, 0, 0, 255)
- 綠色:(0, 255, 0, 255)
- 藍色:(0, 0, 255, 255)
- 灰色:(128, 128, 128, 255)
- 黃色:(255, 255, 0, 255)
- 黑色:(0, 0, 0, 255)
- 紫色:(128, 0, 128, 255)
使用 ImageColor.getcolor() 函式
Pillow 提供了 ImageColor.getcolor() 函式,以便您不需要記住RGBA值即可使用所需的顏色。這個函式需要兩個引數:顏色名稱字串和字串 'RGBA'。
範例
from PIL import ImageColor
# 取得紅色的RGBA值
red_rgba = ImageColor.getcolor('red', 'RGBA')
print(red_rgba) # (255, 0, 0, 255)
# 取得黑色的RGBA值
black_rgba = ImageColor.getcolor('Black', 'RGBA')
print(black_rgba) # (0, 0, 0, 255)
# 取得巧克力色的RGBA值
chocolate_rgba = ImageColor.getcolor('chocolate', 'RGBA')
print(chocolate_rgba) # (210, 105, 30, 255)
# 取得玉米花藍色的RGBA值
cornflowerblue_rgba = ImageColor.getcolor('CornflowerBlue', 'RGBA')
print(cornflowerblue_rgba) # (100, 149, 237, 255)
支援的顏色名稱
Pillow 支援從 'aliceblue' 到 'yellowgreen' 的大量顏色名稱。您可以使用 ImageColor.getcolor() 函式來檢視這些顏色名稱。
顏色名稱列表
您可以透過以下方式檢視 Pillow 支援的顏色名稱列表:
import PIL
# 列出所有支援的顏色名稱
color_names = [name for name in dir(PIL.ImageColor) if not name.startswith('_')]
print(color_names)
影像處理與操控
在 Pillow 中,影像的畫素是透過 x 和 y 座標來定位的。原點位於影像的左上角,使用 (0, 0) 來表示。x 座標從左到右增加,而 y 座標則從上到下增加。這與數學課中學到的 y 座標方向相反。
座標系統
圖 21-1 展示了 28x27 的影像中 x 和 y 座標的工作原理。Pillow 的許多函式和方法都需要一個 box tuple 引數,這是一個包含四個整數座標的元組,代表影像中的矩形區域。這四個整數分別是:
- 左:矩形左邊緣的 x 座標
- 上:矩形上邊緣的 y 座標
- 右:矩形右邊緣右側一畫素的 x 座標(必須大於左座標)
- 下:矩形下邊緣下方一畫素的 y 座標(必須大於上座標)
注意,矩形包括左和上座標,但不包括右和下座標。例如,box tuple (3, 1, 9, 6) 代表圖 21-2 中黑色矩形所包含的所有畫素。
載入和顯示影像
要載入影像,需要使用 Image.open() 函式,並傳入影像檔案名稱作為引數。然後,可以使用 show() 方法在視窗中顯示影像。
from PIL import Image
cat_im = Image.open('zophie.png')
cat_im.show()
如果影像檔案不在當前工作目錄中,需要使用 os.chdir() 函式更改工作目錄。
import os
os.chdir('C:\\folder_with_image_file')
影像物件屬性
影像物件具有幾個有用的屬性,可以提供基本的影像資訊,例如寬度和高度、檔案名稱和圖形格式。例如:
from PIL import Image
cat_im = Image.open('zophie.png')
print(cat_im.size) # 輸出:(816, 1088)
width, height = cat_im.size
print(width) # 輸出:816
內容解密:
在這段程式碼中,我們首先載入 zophie.png 影像檔案,並將其儲存在 cat_im 變數中。然後,我們使用 size 屬性來取得影像的寬度和高度,並將其儲存在 width 和 height 變數中。最後,我們印出寬度的值。
圖表翻譯:
圖表翻譯:
此圖表展示了載入影像、顯示影像、取得影像大小和印出寬度的過程。每個步驟之間的箭頭表示了邏輯流程。
圖片處理技術
圖片處理是電腦視覺中的一個重要領域,涉及對數字圖片進行各種操作,以達到改善圖片品質、提取有用資訊或實作特定效果的目的。Python 的 Pillow 函式庫是一個強大的工具,提供了廣泛的圖片處理功能。
圖片屬性
當你使用 Pillow 開啟一個圖片檔案時,會傳回一個 Image 物件,這個物件包含了圖片的各種屬性,例如寬度、高度、檔名、格式等。你可以透過這些屬性來瞭解圖片的基本資訊。
from PIL import Image
# 開啟圖片檔案
cat_im = Image.open('zophie.png')
# 取得圖片寬度和高度
width, height = cat_im.size
# 取得圖片檔名和格式
filename = cat_im.filename
format = cat_im.format
print(f"寬度:{width}, 高度:{height}")
print(f"檔名:{filename}, 格式:{format}")
建立新圖片
除了開啟現有的圖片檔案外,你也可以使用 Pillow 建立新的圖片。Image.new() 函式可以建立一個新的 Image 物件,指定其模式、寬度、高度和背景色。
# 建立一個新的 100x200 的 RGBA 模式圖片,背景色為紫色
im = Image.new('RGBA', (100, 200), 'purple')
# 儲存圖片到檔案
im.save('purpleImage.png')
裁剪圖片
裁剪圖片是指從原始圖片中選擇一個矩形區域,並將其儲存為新的圖片。crop() 方法可以用於裁剪圖片,需要指定裁剪區域的左上角和右下角坐標。
# 裁剪圖片
cropped_im = cat_im.crop((335, 345, 565, 560))
# 儲存裁剪後的圖片
cropped_im.save('cropped.png')
圖表翻譯
此圖示展示瞭如何使用 Pillow 進行圖片處理,包括建立新圖片、裁剪圖片等操作。透過這些操作,你可以對圖片進行各種變換,以達到所需的效果。
圖表翻譯:
此流程圖展示了使用 Pillow 進行圖片處理的基本步驟,包括開啟圖片檔案、取得圖片屬性、建立新圖片、裁剪圖片和儲存圖片。透過這些步驟,你可以對圖片進行各種操作,以達到所需的效果。
圖片處理技術:裁剪和拼接
在圖片處理中,裁剪和拼接是兩種基本的操作。裁剪是指從原始圖片中提取出一個特定的區域,而拼接則是指將兩個或多個圖片合併成一個新的圖片。
裁剪圖片
裁剪圖片可以使用 crop() 方法,該方法需要一個元組作為引數,指定裁剪區域的左上角和右下角坐標。例如:
from PIL import Image
# 載入圖片
cat_im = Image.open('zophie.png')
# 裁剪圖片
face_im = cat_im.crop((335, 345, 565, 560))
# 顯示裁剪後的圖片大小
print(face_im.size)
這裡,我們從 zophie.png 圖片中裁剪出了一個 230x215 的區域,並將其儲存在 face_im 中。
拼接圖片
拼接圖片可以使用 paste() 方法,該方法需要兩個引數:源圖片和目標坐標。例如:
# 複製原始圖片
cat_copy_im = cat_im.copy()
# 拼接面部圖片到原始圖片上
cat_copy_im.paste(face_im, (0, 0))
# 拼接面部圖片到原始圖片上的其他位置
cat_copy_im.paste(face_im, (400, 500))
# 儲存拼接後的圖片
cat_copy_im.save('pasted.png')
這裡,我們將 face_im 面部圖片拼接到 cat_copy_im 原始圖片上,然後儲存為 pasted.png。
圖片平鋪
如果你想將面部圖片平鋪到整個原始圖片上,可以使用巢狀的 for 迴圈。例如:
# 取得原始圖片和麵部圖片的大小
cat_im_width, cat_im_height = cat_im.size
face_im_width, face_im_height = face_im.size
# 平鋪面部圖片到原始圖片上
for left in range(0, cat_im_width, face_im_width):
for top in range(0, cat_im_height, face_im_height):
cat_copy_im.paste(face_im, (left, top))
這裡,我們使用巢狀的 for 迴圈將面部圖片平鋪到原始圖片上,然後儲存為 pasted.png。
圖表翻譯:
這個流程圖顯示了從原始圖片中裁剪出面部圖片,然後將其拼接到原始圖片上,最終得到平鋪後的圖片。
圖片處理技術
圖片處理是電腦視覺中的一個重要領域,涉及到圖片的變換、編輯和分析。Python 的 Pillow 函式庫是一個強大的工具,提供了許多功能來處理圖片。
貼上圖片
要將一個圖片貼上到另一個圖片上,可以使用 paste() 方法。這個方法需要指定要貼上的圖片、左上角的坐標和右下角的坐標。例如:
from PIL import Image
# 載入圖片
cat_im = Image.open('zophie.png')
# 建立一個新的圖片
cat_copy_im = cat_im.copy()
# 貼上圖片
for left in range(0, cat_im_width, 230):
for top in range(0, cat_im_height, 230):
cat_copy_im.paste(face_im, (left, top))
# 儲存圖片
cat_copy_im.save('tiled.png')
這個程式碼會將 face_im 圖片貼上到 cat_copy_im 圖片上,形成一個網格狀的圖片。
調整圖片大小
要調整圖片的大小,可以使用 resize() 方法。這個方法需要指定新的寬度和高度。例如:
# 載入圖片
cat_im = Image.open('zophie.png')
# 取得圖片的寬度和高度
width, height = cat_im.size
# 調整圖片大小
quarter_sized_im = cat_im.resize((int(width / 2), int(height / 2)))
# 儲存圖片
quarter_sized_im.save('quartersized.png')
這個程式碼會將 cat_im 圖片調整為原來的一半大小。
旋轉和翻轉圖片
要旋轉或翻轉圖片,可以使用 rotate() 和 transpose() 方法。例如:
# 載入圖片
cat_im = Image.open('zophie.png')
# 旋轉圖片
rotated_im = cat_im.rotate(45)
# 翻轉圖片
flipped_im = cat_im.transpose(Image.FLIP_LEFT_RIGHT)
# 儲存圖片
rotated_im.save('rotated.png')
flipped_im.save('flipped.png')
這個程式碼會將 cat_im 圖片旋轉 45 度和翻轉左右。
圖表翻譯:
這個圖表展示了圖片處理的流程,從載入圖片到儲存圖片。
圖片旋轉與翻轉
圖片旋轉與翻轉是影像處理中常見的操作。Python 的 Pillow 函式庫提供了 rotate() 和 transpose() 方法來實作這些功能。
旋轉圖片
rotate() 方法可以將圖片旋轉一定角度。該方法接受一個整數或浮點數引數,代表旋轉角度(以度為單位)。例如:
from PIL import Image
cat_im = Image.open('zophie.png')
cat_im.rotate(90).save('rotated90.png')
cat_im.rotate(180).save('rotated180.png')
cat_im.rotate(270).save('rotated270.png')
這些程式碼將圖片 zophie.png 分別旋轉 90、180 和 270 度,並儲存為新的圖片檔案。
翻轉圖片
transpose() 方法可以將圖片進行水平或垂直翻轉。例如:
cat_im.transpose(Image.FLIP_LEFT_RIGHT).save('horizontal_flip.png')
cat_im.transpose(Image.FLIP_TOP_BOTTOM).save('vertical_flip.png')
這些程式碼將圖片 zophie.png 分別進行水平和垂直翻轉,並儲存為新的圖片檔案。
個別畫素操作
Pillow 還提供了 getpixel() 和 putpixel() 方法來操作個別畫素。例如:
im = Image.new('RGBA', (100, 100))
im.getpixel((0, 0)) # 傳回 (0, 0, 0, 0)
for x in range(100):
for y in range(50):
im.putpixel((x, y), (210, 210, 210))
這些程式碼建立了一個新的 100x100 透明圖片,然後使用 getpixel() 方法取得某個畫素的顏色,並使用 putpixel() 方法將某個畫素的顏色設為淺灰色。
圖表翻譯:
這個圖表展示了 Pillow 中圖片旋轉、翻轉和個別畫素操作的過程。
圖片處理與水印新增
在圖片處理中,新增水印是一種常見的需求。以下將介紹如何使用Python的PIL函式庫來實作圖片縮放和新增水印。
安裝PIL函式庫
首先,需要安裝PIL函式庫,可以使用pip命令:
pip install pillow
載入PIL函式庫
載入PIL函式庫:
from PIL import Image
定義常數
定義常數,例如圖片的最大尺寸和水印圖片的檔名:
SQUARE_FIT_SIZE = 300
LOGO_FILENAME = 'catlogo.png'
載入水印圖片
載入水印圖片:
logo_img = Image.open(LOGO_FILENAME)
處理圖片
處理圖片,包括縮放和新增水印:
for filename in os.listdir('.'):
if filename.endswith('.png') or filename.endswith('.jpg'):
img = Image.open(filename)
width, height = img.size
# 縮放圖片
if width > SQUARE_FIT_SIZE or height > SQUARE_FIT_SIZE:
if width > height:
new_width = SQUARE_FIT_SIZE
new_height = int(height * (SQUARE_FIT_SIZE / width))
else:
new_height = SQUARE_FIT_SIZE
new_width = int(width * (SQUARE_FIT_SIZE / height))
img = img.resize((new_width, new_height))
# 新增水印
img.paste(logo_img, (img.size[0] - logo_img.size[0], img.size[1] - logo_img.size[1]))
# 儲存圖片
img.save('output/' + filename)
執行程式
執行程式,會將所有png和jpg檔案進行縮放和新增水印,並儲存到output目錄中。
圖表翻譯:
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
title Python Pillow 影像處理技巧與實務應用
package "資料視覺化流程" {
package "資料準備" {
component [資料載入] as load
component [資料清洗] as clean
component [資料轉換] as transform
}
package "圖表類型" {
component [折線圖 Line] as line
component [長條圖 Bar] as bar
component [散佈圖 Scatter] as scatter
component [熱力圖 Heatmap] as heatmap
}
package "美化輸出" {
component [樣式設定] as style
component [標籤註解] as label
component [匯出儲存] as export
}
}
load --> clean --> transform
transform --> line
transform --> bar
transform --> scatter
transform --> heatmap
line --> style --> export
bar --> label --> export
note right of scatter
探索變數關係
發現異常值
end note
@enduml內容解密:
SQUARE_FIT_SIZE定義了圖片的最大尺寸。LOGO_FILENAME定義了水印圖片的檔名。logo_img載入了水印圖片。for迴圈處理了所有png和jpg檔案。if判斷了檔案是否為png或jpg。img載入了圖片。width和height取得了圖片的尺寸。if判斷了圖片是否需要縮放。new_width和new_height計算了縮放後的尺寸。img.resize()縮放了圖片。img.paste()增加了水印。img.save()儲存了圖片。
從使用者經驗視角來看,Pillow 與 Matplotlib 的結合,為 Python 影像處理和視覺化提供了極大的便利性。這篇文章涵蓋了從 Pillow 的安裝、基本影像操作、顏色表示法到 Matplotlib 圖表函式庫的應用,循序漸進地闡述了影像處理的關鍵技術,包括裁剪、拼接、調整大小、旋轉、翻轉以及新增水印等。這些技術的整合應用,能有效提升影像編輯效率和視覺化效果。然而,文章未深入探討 Pillow 與其他影像處理函式庫(如 OpenCV)的效能比較,以及在處理大批次影像時的最佳化策略。對於更進階的應用,例如根據深度學習的影像識別和分割,Pillow 的功能略顯不足。展望未來,隨著 AI 技術的發展,預期 Pillow 將進一步整合更多智慧化功能,例如自動影像增強和風格遷移,以降低影像處理的技術門檻,並提升使用者經驗。對於追求高效能和進階功能的開發者,建議深入研究 OpenCV 等更專業的影像處理函式庫,並關注 Pillow 社群的最新發展動態。玄貓認為,Pillow 作為一個輕量級且易於上手的影像處理函式庫,非常適合入門學習和快速原型開發,值得廣大 Python 開發者關注和使用。