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 屬性來取得影像的寬度和高度,並將其儲存在 widthheight 變數中。最後,我們印出寬度的值。

圖表翻譯:

圖表翻譯:

此圖表展示了載入影像、顯示影像、取得影像大小和印出寬度的過程。每個步驟之間的箭頭表示了邏輯流程。

圖片處理技術

圖片處理是電腦視覺中的一個重要領域,涉及對數字圖片進行各種操作,以達到改善圖片品質、提取有用資訊或實作特定效果的目的。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載入了圖片。
  • widthheight取得了圖片的尺寸。
  • if判斷了圖片是否需要縮放。
  • new_widthnew_height計算了縮放後的尺寸。
  • img.resize()縮放了圖片。
  • img.paste()增加了水印。
  • img.save()儲存了圖片。

從使用者經驗視角來看,Pillow 與 Matplotlib 的結合,為 Python 影像處理和視覺化提供了極大的便利性。這篇文章涵蓋了從 Pillow 的安裝、基本影像操作、顏色表示法到 Matplotlib 圖表函式庫的應用,循序漸進地闡述了影像處理的關鍵技術,包括裁剪、拼接、調整大小、旋轉、翻轉以及新增水印等。這些技術的整合應用,能有效提升影像編輯效率和視覺化效果。然而,文章未深入探討 Pillow 與其他影像處理函式庫(如 OpenCV)的效能比較,以及在處理大批次影像時的最佳化策略。對於更進階的應用,例如根據深度學習的影像識別和分割,Pillow 的功能略顯不足。展望未來,隨著 AI 技術的發展,預期 Pillow 將進一步整合更多智慧化功能,例如自動影像增強和風格遷移,以降低影像處理的技術門檻,並提升使用者經驗。對於追求高效能和進階功能的開發者,建議深入研究 OpenCV 等更專業的影像處理函式庫,並關注 Pillow 社群的最新發展動態。玄貓認為,Pillow 作為一個輕量級且易於上手的影像處理函式庫,非常適合入門學習和快速原型開發,值得廣大 Python 開發者關注和使用。