2023-08-26|閱讀時間 ‧ 約 15 分鐘

Python影像處理-Pillow套件

在當今的數位時代,圖像處理已成為許多應用和項目的核心部分,從網站設計到機器學習,高效且靈活的圖像處理工具變得越來越重要。本文將介紹一個好用的Python套件-Pillow,Pillow套件是Python Imaging Library(PIL)的一個分支雖,然它不像Photoshop等軟體一樣強大,但我們可以透過程式碼一次操作大量的圖片,以下是Pillow套件常用到的場合:

  • 開啟和保存圖檔
  • 顯示圖檔
  • 圖像操作
  • 圖像濾鏡
  • 圖像繪圖
  • 圖像模式轉換
  • 圖像合併
  • 色彩調整

等等許多的功能,在使用Pillow套件之前,我們需要先安裝它,只要在終端機打上:

pip install pillow

若沒有錯誤訊息則代表安裝套件成功!接下來,我們就可以使用Pillow套件來操作圖像了。

開啟、顯示圖像

from PIL import Image 
# 開啟圖像
image = Image.open(image_path)
# 顯示圖像
image.show()

image_path 輸入圖像路徑就可以創建一個物件 imageimage儲存了圖像的各種資料,可以先使用 image.show() 來顯示圖片,這邊準備了一張名為 test.png 的圖片,用上述方法將圖片開啟並顯示:

from PIL import Image 
image = Image.open('test.png')
image.show()

test.png

儲存圖片、轉檔

可以使用以下程式碼將圖片儲存

# 儲存圖片
image.save(path)

雖然只有短短的一行,但PIL.Image會根據我們的附檔名來使用特定的格式儲存,例如將上述的圖片以jpg的形式儲存:

# 將圖片以jpg的格式儲存 
image.save('test.jpg')
# 開啟test.jpg
image_jpg = Image.open('test.jpg')
# 顯示test.jpg
image_jpg.show()

test.jpg

取得圖像信息

每張圖片都有一些基本的屬性,如大小、格式和模式,可以使用以下程式碼來獲取:

# 獲取圖像大小(寬度和高度) 
width, height = image.size
# 獲取圖像格式(例如:JPEG、PNG)
format = image.format
# 獲取圖像模式(例如:RGB、RGBA、L)
mode = image.mode

來看看test.png的屬性:

width, height = image.size 
fmt = image.format
mode = image.mode
print(f'大小:{width}x{height}')
print(f'格式:{fmt}')
print(f'模式:{mode}')
大小:1920x1088
格式:PNG
模式:RGB

圖像裁剪

如果想要從圖像中裁剪出一部份,可以使用 crop() 方法

# 定義裁剪區域的左上角和右下角坐標 
box = (left, upper, right, lower)
cropped_image = image.crop(box)

例如將test.png從(0 ,0)到(500, 500)裁減出來並儲存:

box = (0, 0, 500, 500)
cropped_image = image.crop(box)
cropped_image.save('cropped.png')

cropped.png

圖像旋轉

使用 rotate() 方法,可以輕鬆地旋轉圖片:

# 旋轉 90 度
rotated_image = image.rotate(90)

例如將 `cropped_image` 旋轉90度,並儲存為rotated.png:

rotated_image = cropped_image.rotate(90)
rotated_image.save('rotated.png')

rotated.png

圖像縮放

如果要變更圖像的大小,則可以使用 resize() 方法:

new_size = (new_width, new_height)
resized_image = image.resize(new_size)

例如將test.png的長寬縮小一半,顯示縮小過後的大小並儲存為resize.png

new_size = (width // 2, height // 2)
resized_image = image.resize(new_size)
resized_width, resized_height = resized_image.size
print(f"縮小後的圖像大小:{resized_width}x{resized_height}")
resized_image.save('resized.png')
縮小後的圖像大小:960x544

resized.png

圖像濾鏡

Pillow提供了多種濾鏡,如模糊、銳化等,使用濾鏡的方式如下:

from PIL import ImageFilter

# 使用BLUR濾鏡
blurred_image = image.filter(ImageFilter.BLUR)

以下是常用的濾鏡:

  1. BLUR:模糊濾鏡,使圖像變得模糊。
  2. CONTOUR:輪廓濾鏡,強調圖像的輪廓。
  3. DETAIL:細節增強濾鏡,增強圖像的細節。
  4. EDGE_ENHANCE:邊緣增強濾鏡,強調圖像的邊緣。
  5. EDGE_ENHANCE_MORE:更強的邊緣增強濾鏡。
  6. EMBOSS:浮雕效果,使圖像具有三維效果。
  7. FIND_EDGES:邊緣檢測濾鏡,檢測圖像中的邊緣。
  8. SHARPEN:銳化濾鏡,增強圖像的對比度。
  9. SMOOTH:平滑濾鏡,減少圖像的噪音。
  10. SMOOTH_MORE:更強的平滑濾鏡。
  11. GAUSSIANBLUR(radius):高斯模糊,其中 radius 指定模糊的半徑。
  12. UNSHARP_MASK(radius, percent, threshold):非銳化遮罩,用於增強圖像的細節。

將test.png套用CONTOUR濾鏡,並儲存為contourred.png:

from PIL import ImageFilter
contourred_image = image.filter(ImageFilter.CONTOUR)
contourred_image.save('contourred.png')

contourred.png

圖像繪圖

使用 Pillow,還可以在圖像上繪製形狀和文字。以下是一個簡單的示例,顯示如何在圖像上繪製一個矩形:

from PIL import ImageDraw

draw = ImageDraw.Draw(image)

# 在座標(50, 50)至(150, 150)繪製一個外框為紅色,內部填滿藍色的矩形
rectangle_position = (50, 50, 150, 150)
draw.rectangle(rectangle_position, fill="blue", outline="red")

或者是在圖像上繪製文字:

from PIL import ImageDraw, ImageFont
draw = ImageDraw.Draw(image)
# 使用內置字體
font = ImageFont.load_default()

# 或使用自己的字體文件(例如 TTF 或 OTF 格式)
# font = ImageFont.truetype('path_to_your_font.ttf', size=30)

# 文字的起始位置
position = (50, 50)
# 白色
text_color = (255, 255, 255)
draw.text(position, "Hello, Pillow!", fill=text_color, font=font)

在resized.png上繪製一個矩形,並寫上test,儲存為drawn.png:

from PIL import ImageDraw, ImageFont

# 繪製矩形
drawn_image = Image.open('resized.png')
draw = ImageDraw.Draw(drawn_image)
rectangle_position = (50, 50, 150, 150)
draw.rectangle(rectangle_position, fill="blue", outline="red")

# 寫上test.png
font = ImageFont.load_default()
position = (50, 50)
text_color = (255, 255, 255)
draw.text(position, "test", fill=text_color, font=font)
drawn_image.save('drawn.png')

drawn.png

除了矩形之外,還有以下圖形可以繪製:

  1. 線條 (Line):
draw.line((start_x, start_y, end_x, end_y), fill=color)
  1. 矩形 (Rectangle):
draw.rectangle((left, upper, right, lower), fill=fill_color, outline=outline_color)
  1. 橢圓 (Ellipse):
    使用與矩形相同的坐標系統,但繪製的是一個橢圓,該橢圓完全位於指定的矩形內。
draw.ellipse((left, upper, right, lower), fill=fill_color, outline=outline_color)
  1. 圓 (Circle):
    圓實際上是一種特殊的橢圓,可以使用 ellipse 方法繪製它,只需確保矩形的寬度和高度相同。
draw.ellipse((center_x-radius, center_y-radius, center_x+radius, center_y+radius), fill=fill_color, outline=outline_color)
  1. 多邊形 (Polygon):
    可以繪製三角形、四邊形或其他多邊形。
draw.polygon([(x1, y1), (x2, y2), ...], fill=fill_color, outline=outline_color)
  1. 圓弧 (Arc):
    繪製橢圓的一部分。
draw.arc((left, upper, right, lower), start_angle, end_angle, fill=color)
  1. 扇形 (Chord):
    與圓弧相似,但須連接起始和結束點。
draw.chord((left, upper, right, lower), start_angle, end_angle, fill=fill_color, outline=outline_color)
  1. 餅狀圖 (Pieslice):
    與扇形相似,但還有一條從起始點到橢圓中心的線,以及一條從結束點到橢圓中心的線。
draw.pieslice((left, upper, right, lower), start_angle, end_angle, fil

圖像模式轉換

圖像的模式如下:

  1. L - 亮度 (Luminance)。這是一個灰度模式,其中每個像素使用 8 位(1 byte)表示,範圍從 0(黑色)到 255(白色)。
  2. RGB - 紅色、綠色和藍色模式。這是一個真彩色模式,其中每個像素由三個 8 位的值組成,分別表示紅色、綠色和藍色。
  3. RGBA - 與 RGB 相同,但還有一個額外的透明度通道(Alpha)。Alpha 通道用於表示像素的透明度。
  4. CMYK - 青色、品紅、黃色和黑色模式。這是一個用於印刷的模式,其中每個像素由四個 8 位的值組成。
  5. YCbCr - 亮度和色差模式。它是一種用於數字視頻的模式。
  6. LAB - CIELAB 色彩空間。它是一種用於描述人類視覺感知的色彩的模式。
  7. HSV - 色調、飽和度和值模式。
  8. I - 32 位整數像素模式。
  9. F - 32 位浮點像素模式。
  10. P - 調色板模式。在此模式下,圖像的數據是 8 位的索引值,這些值對應於一個調色板,調色板中包含實際的 RGB 值。

可以使用 convert()轉換:

gray_image = image.convert('L')

例如將resized.png轉換成灰階的形式,並儲存成gray.png:

gray_image = resized_image.convert('L')
print(f'格式:{gray_image.mode}')
gray_image.save('gray.png')
格式:L

gray.png

圖像合併

如果擁有多張圖像,可以使用 ImageChopsblend() 函式合併圖片, alphaimage2 貼在 image1 的透明度:

from PIL import ImageChops

# 合併兩張圖像
merged_image = ImageChops.blend(image1, image2, alpha=0.5)

這個的例子我們將在下一篇介紹如何製作gif時用到。

圖像的色彩調整

使用Pillow套件也可調整圖像的亮度,對比度與飽和度,示例如下:

調整亮度

from PIL import ImageEnhance
enhancer = ImageEnhance.Brightness(image)
# 增加亮度,1.5 表示增加 50%
brighter_image = enhancer.enhance(1.5)

調整對比度

enhancer = ImageEnhance.Contrast(image)
# 增加對比度,2.0 表示增加 100%
contrast_image = enhancer.enhance(2.0)

調整飽和度

enhancer = ImageEnhance.Color(image)
# 增加飽和度,1.5 表示增加 50%
saturated_image = enhancer.enhance(1.5)

以上是Pillow套件的一些基礎操作,當然,Pillow套件還有許多強大的功能,在下一篇文章會介紹如何使用Pillow套件來製作gif動畫。

分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.