Python影像處理-Pillow套件

閱讀時間約 15 分鐘

在當今的數位時代,圖像處理已成為許多應用和項目的核心部分,從網站設計到機器學習,高效且靈活的圖像處理工具變得越來越重要。本文將介紹一個好用的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

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

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

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

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

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

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

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

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動畫。

13會員
4內容數
留言0
查看全部
發表第一個留言支持創作者!
你可能也想看
創作者要怎麼好好休息 + 避免工作過量?《黑貓創作報#4》午安,最近累不累? 這篇不是虛假的關心。而是《黑貓創作報》發行以來可能最重要的一篇。 是的,我們這篇講怎麼補充能量,也就是怎麼休息。
Thumbnail
avatar
黑貓老師
2024-06-29
防曬產品係數測試報告彙整(2024年)從2014年起,自己對於市售防曬產品的效能產生了濃厚的興趣。因為當時候發現不少產品的防曬係數其實標示是有問題的,像是原本應該是人體測試的SPF與PA數值,實際上沒有做,只用機器測試的數據來充當,但這兩者卻有很大的差異。像是防曬係數其實有強度、廣度與平均度三個面向需要一起判斷,但多數廠商並沒有完整標示
Thumbnail
avatar
邱品齊皮膚科醫師
2023-04-27
【Python套件管理區 - PyPI系列】平台開始使用F2A來管制套件囉一早看著IThome的新聞發現到這個標題「📢 PyPI新帳號現需要啟用雙因素驗證才能執行管理操作」, 而近期幾乎都在接觸Python語言, 在Python的生態圈裡相信對於「pip install…」應該相當熟悉了吧! 但對於背後的平台相信我們不曾仔細去了解一番, 這好藉著這次的觀點也順便來介紹一
Thumbnail
avatar
阿Han
2023-08-12
Python學習筆記6-錯誤處理try...except...本篇文章介紹了在Python中的錯誤處理機制。錯誤處理在程式設計中是一個重要環節,能夠有效處理可能發生的錯誤。示範了如何捕捉錯誤並根據不同錯誤類型進行處理或提示。此外,還介紹了指定特定錯誤類型和捕捉所有錯誤的方法。透過學習這些錯誤處理的技巧,讀者可以更好地避免程式崩潰,提供友善的使用者體驗。
Thumbnail
avatar
好奇的小仙人掌
2023-06-22
Python學習筆記5-函式與模組我們將探索函式的定義和調用,這是程式設計中非常重要且強大的概念,它可以將大型程式切割成小的、可重複使用的函式。讓我們一起來了解吧!函式的定義、呼叫和返回值是學習函式的核心。
Thumbnail
avatar
好奇的小仙人掌
2023-06-21
Python學習筆記3 - 列表的建立與存取以及常用方法探索Python學習筆記中列表的建立、存取和常用方法。從使用中括號定義列表到了解索引、新增、刪除、修改等操作,並介紹append、remove、count等常用方法。
Thumbnail
avatar
好奇的小仙人掌
2023-06-20
Python學習筆記4-字典的使用方法在本篇Python學習筆記中,我們探討了字典的建立與存取,以及常用方法,字典是一種強大的資料型態,透過key和value的對應關係存儲和取得資料,我們學會了建立字典、存取資料、新增/修改/刪除項目,以及取得key和value的方法,字典是Python中不可或缺的工具!
Thumbnail
avatar
好奇的小仙人掌
2023-06-20
Python學習筆記2.2-while 迴圈我們探討了while迴圈的使用,不同於for迴圈,while迴圈以條件式判斷為基礎,而非限定重複次數。我們介紹了使用break語句強制結束迴圈,以及使用continue語句跳過特定程式碼並返回迴圈開頭,同時,我們提及了無窮迴圈的概念,強調了在迴圈中必須更改迴圈變數的值,以避免無窮迴圈的發生。
Thumbnail
avatar
好奇的小仙人掌
2023-06-20
[Python] 字串的大小寫處理函數upper() 函數 lower() 函數
avatar
Pochi
2023-06-10
[Python] 使用 pyautogui 套件來取得視窗 (windows)使用 pyautogui 套件來取得所有正在視窗 (windows)。
avatar
Pochi
2023-04-25
【Google Colab Python系列】 初探Whisper: 來一段Youtube影片進行語音辨識吧!這個篇章主要是讓我們能夠熟悉Whisper的安裝與使用方式,並簡單的對Youtube影片進行線上翻譯的工作,主軸在於了解一下整個Whisper使用方式到底是簡單還是複雜,就讓我們一起來玩玩看吧! 在這之前我們還是說一下Whisper它是什麼樣的一個工具,能夠做什麼? Whisper 是OpenAI
Thumbnail
avatar
阿Han
2023-04-23
Python+LINE Bot 輕鬆打造股市機器人(六) : LINE Bot基本功能-圖片、影片及音訊今天我們再來教更多不一樣的回訊方式,像是讓機器人回傳圖片、影片,甚至是音訊,使我們的機器人更佳的活靈活現,就讓我們趕快開始今天的教學吧!!
Thumbnail
avatar
陳陳
2022-03-12