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

留言
avatar-img
留言分享你的想法!
UwU-avatar-img
2023/08/26
avatar-img
HataRin的沙龍
14會員
4內容數
HataRin的沙龍的其他內容
2023/09/15
動態規劃(Dynamic Programming)的基本思想是將複雜的問題分解為較小的子問題,並找到這些子問題的關聯性,通過這些子問題的解,我們可以避免重複計算,從而節省計算資源。這種過程稱為「記憶化(Memoization)」,通常使用數組或字典來實現,以在後續的計算中快速查找和重用中間結果。
Thumbnail
2023/09/15
動態規劃(Dynamic Programming)的基本思想是將複雜的問題分解為較小的子問題,並找到這些子問題的關聯性,通過這些子問題的解,我們可以避免重複計算,從而節省計算資源。這種過程稱為「記憶化(Memoization)」,通常使用數組或字典來實現,以在後續的計算中快速查找和重用中間結果。
Thumbnail
2023/09/04
序列化(serialization)是將資料結構或對象轉換為一個格式,可以被儲存到文件或記憶體中,或者可以透過網路傳輸到另一個系統環境。這使得資料可以在不同的系統之間進行交換,並在需要時重新建構回原始的資料結構。本文將介紹兩個好用的Python套件-JSON與Pickle,並比較兩者的不同。
Thumbnail
2023/09/04
序列化(serialization)是將資料結構或對象轉換為一個格式,可以被儲存到文件或記憶體中,或者可以透過網路傳輸到另一個系統環境。這使得資料可以在不同的系統之間進行交換,並在需要時重新建構回原始的資料結構。本文將介紹兩個好用的Python套件-JSON與Pickle,並比較兩者的不同。
Thumbnail
2023/08/29
上一篇文章說明了Pillow套件的基礎操作,這篇文章則會透過四個範例來示範如何利用Pillow製作簡單的GIF動畫。
Thumbnail
2023/08/29
上一篇文章說明了Pillow套件的基礎操作,這篇文章則會透過四個範例來示範如何利用Pillow製作簡單的GIF動畫。
Thumbnail
看更多
你可能也想看
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
OpenCV 支援讀取和保存 TIFF(Tagged Image File Format)檔案,但對於合併多張圖片成為多頁的 TIFF 檔案,OpenCV 沒有的這功能。 可以使用 Pillow 庫(Python Imaging Library, PIL 的分支)來實現。
Thumbnail
OpenCV 支援讀取和保存 TIFF(Tagged Image File Format)檔案,但對於合併多張圖片成為多頁的 TIFF 檔案,OpenCV 沒有的這功能。 可以使用 Pillow 庫(Python Imaging Library, PIL 的分支)來實現。
Thumbnail
在幾乎人人都有手機的時代,相簿裡會有許多生活的紀錄,但很少有人會回頭整理,導致許多知識都被忽略。因此,今天要跟大家分享一款很棒的 AI 工具,專為解決這個問題而生 — Photes.io。它能將我們日常生活的照片、螢幕截圖,以及圖像轉化為筆記,並直接匯出到 Notion 中,大大提升我們的生產力。
Thumbnail
在幾乎人人都有手機的時代,相簿裡會有許多生活的紀錄,但很少有人會回頭整理,導致許多知識都被忽略。因此,今天要跟大家分享一款很棒的 AI 工具,專為解決這個問題而生 — Photes.io。它能將我們日常生活的照片、螢幕截圖,以及圖像轉化為筆記,並直接匯出到 Notion 中,大大提升我們的生產力。
Thumbnail
[影像處理_OpenCV Python]使用Python撰寫影像處理功能,圖片遮罩或濾除掉不要的地方,旋轉圖片 以下範例將呈現影像處理三種不同的應用: 遮罩的實現 濾除 旋轉
Thumbnail
[影像處理_OpenCV Python]使用Python撰寫影像處理功能,圖片遮罩或濾除掉不要的地方,旋轉圖片 以下範例將呈現影像處理三種不同的應用: 遮罩的實現 濾除 旋轉
Thumbnail
本文帶你三分鐘內跑通"文字生圖片"的網頁APP,使用最頂尖生成技術,LCM-Lora-SDXL模型,能夠在短時間內生成符合文字描述的高解析圖片。屬於免費開源模型(License Link),請不要產生有害內容,進行合理的使用。
Thumbnail
本文帶你三分鐘內跑通"文字生圖片"的網頁APP,使用最頂尖生成技術,LCM-Lora-SDXL模型,能夠在短時間內生成符合文字描述的高解析圖片。屬於免費開源模型(License Link),請不要產生有害內容,進行合理的使用。
Thumbnail
粒子消散效果指令: 我想將照片塊狀消散效果應用到這張圖片上。你能幫我嗎?為我提供下載生成的視頻的連結。使用下面的代碼
Thumbnail
粒子消散效果指令: 我想將照片塊狀消散效果應用到這張圖片上。你能幫我嗎?為我提供下載生成的視頻的連結。使用下面的代碼
Thumbnail
自從拿到相機後一直有個困擾,每次出門拍了很多照片,回來後除了初步挑選照片,將拍壞的照片刪除之外,再來就是將照片依照自己想要的方式歸檔。
Thumbnail
自從拿到相機後一直有個困擾,每次出門拍了很多照片,回來後除了初步挑選照片,將拍壞的照片刪除之外,再來就是將照片依照自己想要的方式歸檔。
Thumbnail
上一篇文章說明了Pillow套件的基礎操作,這篇文章則會透過四個範例來示範如何利用Pillow製作簡單的GIF動畫。
Thumbnail
上一篇文章說明了Pillow套件的基礎操作,這篇文章則會透過四個範例來示範如何利用Pillow製作簡單的GIF動畫。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News