在當今的數位時代,圖像處理已成為許多應用和項目的核心部分,從網站設計到機器學習,高效且靈活的圖像處理工具變得越來越重要。本文將介紹一個好用的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
輸入圖像路徑就可以創建一個物件 image
, image
儲存了圖像的各種資料,可以先使用 image.show()
來顯示圖片,這邊準備了一張名為 test.png 的圖片,用上述方法將圖片開啟並顯示:
from PIL import Image
image = Image.open('test.png')
image.show()
可以使用以下程式碼將圖片儲存
# 儲存圖片
image.save(path)
雖然只有短短的一行,但PIL.Image會根據我們的附檔名來使用特定的格式儲存,例如將上述的圖片以jpg的形式儲存:
# 將圖片以jpg的格式儲存
image.save('test.jpg')
# 開啟test.jpg
image_jpg = Image.open('test.jpg')
# 顯示test.jpg
image_jpg.show()
每張圖片都有一些基本的屬性,如大小、格式和模式,可以使用以下程式碼來獲取:
# 獲取圖像大小(寬度和高度)
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')
使用 rotate()
方法,可以輕鬆地旋轉圖片:
# 旋轉 90 度
rotated_image = image.rotate(90)
例如將 `cropped_image` 旋轉90度,並儲存為rotated.png:
rotated_image = cropped_image.rotate(90)
rotated_image.save('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
Pillow提供了多種濾鏡,如模糊、銳化等,使用濾鏡的方式如下:
from PIL import ImageFilter
# 使用BLUR濾鏡
blurred_image = image.filter(ImageFilter.BLUR)
以下是常用的濾鏡:
radius
指定模糊的半徑。將test.png套用CONTOUR濾鏡,並儲存為contourred.png:
from PIL import ImageFilter
contourred_image = image.filter(ImageFilter.CONTOUR)
contourred_image.save('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')
除了矩形之外,還有以下圖形可以繪製:
draw.line((start_x, start_y, end_x, end_y), fill=color)
draw.rectangle((left, upper, right, lower), fill=fill_color, outline=outline_color)
draw.ellipse((left, upper, right, lower), fill=fill_color, outline=outline_color)
draw.ellipse((center_x-radius, center_y-radius, center_x+radius, center_y+radius), fill=fill_color, outline=outline_color)
draw.polygon([(x1, y1), (x2, y2), ...], fill=fill_color, outline=outline_color)
draw.arc((left, upper, right, lower), start_angle, end_angle, fill=color)
draw.chord((left, upper, right, lower), start_angle, end_angle, fill=fill_color, outline=outline_color)
draw.pieslice((left, upper, right, lower), start_angle, end_angle, fil
圖像的模式如下:
可以使用 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
如果擁有多張圖像,可以使用 ImageChops
的 blend()
函式合併圖片, alpha
為 image2
貼在 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動畫。