Python Pillow - 快速指南



Python Pillow - 概述

在當今的數字世界中,我們遇到了大量的數字影像。如果我們使用 Python 程式語言,它提供了許多影像處理庫來為數字影像新增影像處理功能。

一些最常見的影像處理庫有:OpenCV、Python 影像庫 (PIL)、Scikit-image、Pillow。但是,在本教程中,我們只關注 **Pillow 模組**,並嘗試探索該模組的各種功能。

Pillow 建立在 PIL (Python Image Library) 之上。PIL 是 Python 中影像處理的重要模組之一。但是,PIL 模組自 2011 年以來一直不受支援,並且不支援 Python 3。

Pillow 模組提供了更多功能,可以在所有主要作業系統上執行,並支援 Python 3。它支援各種各樣的影像,例如“jpeg”、“png”、“bmp”、“gif”、“ppm”、“tiff”。您可以使用 Pillow 模組對數字影像執行幾乎所有操作。除了基本影像處理功能外,還包括點運算、使用內建卷積核濾波影像以及顏色空間轉換。

影像檔案

Python 影像庫最適合影像歸檔和批次處理應用程式。Python Pillow 包可用於建立縮圖、從一種格式轉換為另一種格式以及列印影像等。

影像顯示

您可以使用 Tk PhotoImage、BitmapImage 和 Windows DIB 介面顯示影像,這些介面可與 PythonWin 和其他基於 Windows 的工具包以及許多其他圖形使用者介面 (GUI) 工具包一起使用。

出於除錯目的,有一個 show() 方法將影像儲存到磁碟,該方法呼叫外部顯示實用程式。

影像處理

Pillow 庫包含所有基本影像處理功能。您可以進行影像調整大小、旋轉和變換。

Pillow 模組允許您使用直方圖方法從影像中提取一些統計資料,這些資料稍後可用於統計分析和自動對比度增強。

Python Pillow - 環境設定

本章討論如何在您的計算機上安裝 Pillow 包。

安裝 Pillow 包非常容易,尤其是在使用 pip 安裝時。

使用 pip 安裝 Pillow

要使用 pip 安裝 Pillow,只需在命令提示符中執行以下命令:

python -m pip install pip
python -m pip install pillow

如果您的計算機上已經安裝了 pip 和 Pillow,則上述命令將簡單地顯示“需求已滿足”,如下所示:

Requirement

Python Pillow - 使用 Image 模組

要顯示影像,Pillow 庫在其內部使用影像類。Pillow 包中的 Image 模組包含一些重要的內建函式,例如載入影像或建立新影像等。

開啟、旋轉和顯示影像

要載入影像,我們只需從 Pillow 中匯入 Image 模組並呼叫 **Image.open()**,傳入影像檔名。

為了使其與舊模組 Python Imaging Library (PIL) 向後相容,我們不呼叫 Pillow 模組,而是呼叫 PIL 模組。這就是為什麼我們的程式碼以 **“from PIL import Image”** 而不是 **“from Pillow import Image”** 開頭。

接下來,我們將透過呼叫 **Image.open() 函式** 來載入影像,該函式返回 Image 物件資料型別的返回值。我們可以對影像物件進行的任何修改都可以使用 **save()** 方法儲存到影像檔案中。我們使用 **Image.open()** 獲取的影像物件稍後可用於調整大小、裁剪、繪製或在此 Image 物件上呼叫其他影像處理方法。

示例

以下示例演示瞭如何使用 Python Pillow 旋轉影像:

from PIL import Image
#Open image using Image module
im = Image.open("images/cuba.jpg")
#Show actual Image
im.show()
#Show rotated Image
im = im.rotate(45)
im.show()

輸出

如果將上述程式儲存為 Example.py 並執行,它將使用標準 PNG 顯示實用程式顯示原始影像和旋轉後的影像,如下所示:

實際影像

Original

旋轉後的影像(45 度)

Rotated Image

Image 模組的屬性

Image 類的例項具有一些屬性。讓我們嘗試透過示例瞭解其中的一些:

Image.filename

此函式用於獲取影像的檔名或路徑。

>>>image = Image.open('beach1.jpg')
>>> image.filename
'beach1.jpg'

Image.format

此函式返回影像檔案的格式,例如“JPEG”、“BMP”、“PNG”等。

>>> image = Image.open('beach1.jpg')
>>>
>>> image.format
'JPEG'

Image.mode

它用於獲取影像使用的畫素格式。典型值是“1”、“L”、“RGB”或“CMYK”。

>>> image.mode
'RGB'

Image.size

它返回包含影像高度和寬度的元組。

>>> image.size
(1280, 721)

Image.width

它僅返回影像的寬度。

>>> image.width
1280

Image.height

它僅返回影像的高度。

>>> image.height
721

Image.info

它返回一個字典,其中包含與影像相關聯的資料。

>>> image.info
{'jfif': 257, 'jfif_version': (1, 1), 'dpi': (300, 300), 'jfif_unit': 1, 'jfif_density': (300, 300), 'exif': b"Exif\x00\x00MM\x00*\x00\x00\x00
....
....
\xeb\x00\x00'\x10\x00\x00\xd7\xb3\x00\x00\x03\xe8"}

Image.palette

如果存在,它返回顏色調色盤表。

>>> image.palette

**以上輸出** - None

Python Pillow - 處理影像

本章詳細闡述瞭如何在 Pillow 中讀取和儲存影像等主題。

讀取影像

使用 Pillow 庫讀取和寫入影像非常簡單,藉助 **PIL.Image 模組函式**。

語法

Image.open(fp, mode=’r’)

其中

  • **fp** - 檔名(字串)、pathlib.Path 物件或檔案物件。檔案物件必須實現 read()、seek() 和 tell() 方法,並以二進位制模式開啟。

  • **mode** - 這是一個可選引數,如果給出,必須為“r”。

  • **返回值** - 一個 Image 物件。

  • **錯誤** - 如果找不到檔案,或者無法開啟和識別影像。

示例

以下是一個非常簡單的示例,我們將開啟任何格式的影像(我們使用 .**jpg**),在視窗中顯示它,然後以另一種檔案格式(.**png**)儲存它(預設位置)。

from PIL import Image
image = Image.open('beach1.jpg')
image.show()
image.save('beach1.bmp')
image1 = Image.open('beach1.bmp')
image1.show()

在上面的示例中,我們從 PIL 庫中匯入 Image 模組,然後呼叫 **Image.open()** 函式從磁碟讀取影像,該函式返回影像物件資料型別。它將透過檢視檔案內容自動確定檔案型別。對於讀取,**open()** 函式接受 **檔名(字串)**、**路徑物件** 或 **影像(檔案)** 物件。

因此,透過使用 open() 函式,我們實際上是在讀取影像。Image.open() 將讀取影像並獲取影像的所有相關資訊。

輸出

如果將上述程式儲存為 Example.py 並執行,它將使用標準 PNG 顯示實用程式顯示原始影像(.jpg)和重新儲存的影像(.bmp),如下所示:

實際影像

Original

重新儲存的影像(.bmp)

Resaved Image

儲存影像

save() 函式將影像寫入檔案。與讀取(open() 函式)一樣,save() 函式接受檔名、路徑物件或已開啟以進行寫入的檔案物件。

語法

Image.save(fp, format=None, **params)

其中,

  • **fp** - 檔名(字串)、pathlib.Path 物件或檔案物件。

  • **format** - 可選的格式覆蓋。如果省略,則要使用的格式將從檔名副檔名確定。如果使用檔案物件而不是檔名,則應始終使用此引數。

  • **options** - 傳遞給影像寫入器的額外引數。

  • **返回值** - None

  • **KeyError** - 如果無法從檔名確定輸出格式,請使用 format 選項來解決此問題。

  • **IOError** - 如果無法寫入檔案,則可能已建立檔案,並且可能包含部分資料。

簡而言之,上述語法將影像儲存到給定的檔名下。如果未指定格式,則基於當前檔名副檔名。為了向編寫器提供其他說明,我們使用關鍵字選項。

image.save('beach1.bmp')

在上面的示例中,它根據副檔名儲存檔案以確定影像型別,例如 - 上述操作將在我們的當前工作目錄中建立一個 bmp 檔案。

您還可以顯式地將檔案型別作為第二個引數指定 -

image.save('beach1.gif', 'GIF')

Python Pillow - 建立縮圖

有時,需要所有影像的高度和寬度都相等。實現此目的的一種方法是使用 pillow 庫中的 thumbnail() 函式建立所有影像的縮圖。

此方法修改影像以包含其自身的縮圖版本,並且影像的大小不會大於給定大小。

該方法計算適當的縮圖大小以保留影像的縱橫比,呼叫 **draft() 方法** 配置檔案讀取器(在適用情況下),最後調整影像大小。

語法

Image.thumbnail(size, resample=3)

其中,

  • **Size** - 所需大小

  • **Resample** - 可選重取樣濾鏡。它可以是以下之一:PIL.Image.NEAREST、PIL.Image.BILINEAR、PIL.Image.BICUBIC 或 PIL.Image.LANCZOS。如果省略,則預設為 PIL.Image.BICUBIC。

  • **Returns** - 無

示例

以下示例演示了使用 python pillow 建立縮圖 -

from PIL import Image
def tnails():
   try:
      image = Image.open('images/cat.jpg')
      image.thumbnail((90,90))
      image.save('images/thumbnail.jpg')
      image1 = Image.open('images/thumbnail.jpg')
      image1.show()
   except IOError:
      pass
tnails()

輸出

如果將上述程式儲存為 Example.py 並執行,它將使用預設的 PNG 顯示實用程式顯示建立的縮圖,如下所示 -

原始影像

original_image.jpg

輸出影像

Output Image

Python Pillow - 合併影像

Pillow 包允許您將一個影像貼上到另一個影像上。merge() 函式接受模式和影像元組作為引數,並將它們組合成單個影像。

語法

Image.merge(mode, bands)

其中,

  • **mode** - 輸出影像要使用的模式。

  • **bands** - 包含輸出影像中每個波段的一個單波段影像的序列。所有波段必須具有相同的大小。

  • **返回值** - Image 物件。

使用 merge() 函式,您可以合併影像的 RGB 波段,如下所示 -

from PIL import Image
image = Image.open("beach1.jpg")
r, g, b = image.split()
image.show()
image = Image.merge("RGB", (b, g, r))
image.show()

執行上述程式碼段後,您可以看到原始影像和合並 RGB 波段後的影像,如下所示 -

輸入影像

Input Image

輸出影像

Output Image1

合併兩個影像

同樣,要合併兩個不同的影像,您需要 -

  • 使用 open() 函式為所需的影像建立影像物件。

  • 合併兩個影像時,需要確保兩個影像的大小相同。因此,獲取兩個影像的每個大小,並在需要時相應地調整其大小。

  • 使用 Image.new() 函式建立一個空影像。

  • 使用 paste() 函式貼上影像。

  • 使用 save() 和 show() 函式儲存和顯示結果影像。

示例

以下示例演示了使用 python pillow 合併兩個影像 -

from PIL import Image
#Read the two images
image1 = Image.open('images/elephant.jpg')
image1.show()
image2 = Image.open('images/ladakh.jpg')
image2.show()
#resize, first image
image1 = image1.resize((426, 240))
image1_size = image1.size
image2_size = image2.size
new_image = Image.new('RGB',(2*image1_size[0], image1_size[1]), (250,250,250))
new_image.paste(image1,(0,0))
new_image.paste(image2,(image1_size[0],0))
new_image.save("images/merged_image.jpg","JPEG")
new_image.show()

輸出

如果將上述程式儲存為 Example.py 並執行,它將使用標準 PNG 顯示實用程式顯示兩個輸入影像和合並後的影像,如下所示 -

輸入影像1

Input Image1

輸入影像2

Input Image2

合併後的影像

Merged Image

Python Pillow - 模糊影像

模糊影像可以透過應用濾鏡來減少影像中的噪聲水平來完成。影像模糊是影像處理的重要方面之一。

Pillow 庫中的 **ImageFilter 類** 提供了幾個標準影像濾鏡。可以透過使用 ImageFilter 類中定義的所需濾鏡型別呼叫 Image 物件的 **filter() 方法** 將影像濾鏡應用於影像。

有多種技術用於模糊影像,我們將討論以下提到的技術。

  • 簡單模糊

  • 方框模糊

  • 高斯模糊

所有這三種技術都將使用“Image.filter()”方法將濾鏡應用於影像。

簡單模糊

它根據特定核心或卷積矩陣指定的模糊效果應用於影像。

語法

filter(ImageFilter.BLUR)

示例

#Import required Image library
from PIL import Image, ImageFilter

#Open existing image
OriImage = Image.open('images/boy.jpg')
OriImage.show()

blurImage = OriImage.filter(ImageFilter.BLUR)
blurImage.show()
#Save blurImage
blurImage.save('images/simBlurImage.jpg')

執行後,上述示例將生成兩個標準 PNG 顯示實用程式視窗(在本例中為 Windows **照片** 應用)。

原始影像

Original Image2

模糊影像

Blurred Image

方框模糊

在此濾鏡中,我們使用“radius”作為引數。半徑與模糊值成正比。

語法

ImageFilter.BoxBlur(radius)

其中,

  • **Radius** - 一個方向上的方框大小。

  • **Radius 0** - 表示沒有模糊,並返回相同的影像。

  • **Radius 1** - 在每個方向上取 1 個畫素,即總共 9 個畫素。

示例

#Import required Image library
from PIL import Image,
 
#Open existing image
OriImage = Image.open('images/boy.jpg')
OriImage.show()

#Applying BoxBlur filter
boxImage = OriImage.filter(ImageFilter.BoxBlur(5))
boxImage.show()

#Save Boxblur image
boxImage.save('images/boxblur.jpg')

輸出

執行後,上述示例將生成兩個標準 PNG 顯示實用程式視窗(在本例中為 Windows 照片應用)。

原始影像

Original Image3

模糊影像

Blurred Image2

高斯模糊

此濾鏡也使用引數 radius 並執行與方框模糊相同的工作,但有一些演算法更改。簡而言之,更改 radius 值將生成不同強度的“高斯模糊”影像。

語法

ImageFilter.GaussianBlur(radius=2)

其中,

  • Radius - 模糊半徑

示例

#Import required Image library
from PIL import Image, ImageFilter

#Open existing image
OriImage = Image.open('images/boy.jpg')
OriImage.show()

#Applying GaussianBlur filter
gaussImage = OriImage.filter(ImageFilter.GaussianBlur(5))
gaussImage.show()

#Save Gaussian Blur Image
gaussImage.save('images/gaussian_blur.jpg')

輸出

執行後,上述示例將生成兩個標準 PNG 顯示實用程式視窗(在本例中為 Windows **照片** 應用)。

原始影像

Orignal Images4

模糊影像

Blurred Image3

Python Pillow - 裁剪影像

裁剪是影像處理的重要操作之一,用於去除影像中不需要的部分以及向影像新增所需的功能。它廣泛用於 Web 應用程式中,用於上傳影像。

Pillow 中影像類的 crop() 函式需要將要裁剪的部分作為矩形。要從影像中裁剪的矩形部分指定為一個四元素元組,並返回已裁剪的影像的矩形部分作為影像物件。

示例

以下示例演示瞭如何使用 python pillow 旋轉影像 -

#Import required Image library
from PIL import Image

#Create an Image Object from an Image
im = Image.open('images/elephant.jpg')

#Display actual image
im.show()

#left, upper, right, lowe
#Crop
cropped = im.crop((1,2,300,300))

#Display the cropped portion
cropped.show()

#Save the cropped image
cropped.save('images/croppedBeach1.jpg')

輸出

如果將上述程式儲存為 Example.py 並執行,它將使用標準 PNG 顯示實用程式顯示原始影像和裁剪後的影像,如下所示 -

原始影像

Original Image5

裁剪後的影像

Cropped Image

Python Pillow - 翻轉和旋轉影像

在使用 python 影像處理庫處理影像時,有時需要翻轉現有影像以獲得更多見解,以增強其可見性或由於您的需求。

pillow 庫的 Image 模組允許我們非常輕鬆地翻轉影像。我們將使用 Image 模組中的 transpose() 函式來翻轉影像。“transpose()”支援的一些最常用的方法是 -

  • **Image.FLIP_LEFT_RIGHT** - 水平翻轉影像

  • **Image.FLIP_TOP_BOTTOM** - 垂直翻轉影像

  • **Image.ROTATE_90** - 透過指定度數旋轉影像

示例 1:水平翻轉的影像

以下 Python 示例讀取影像,將其水平翻轉,並使用標準 PNG 顯示實用程式顯示原始影像和翻轉後的影像 -

# import required image module
from PIL import Image

# Open an already existing image
imageObject = Image.open("images/spiderman.jpg")

# Do a flip of left and right
hori_flippedImage = imageObject.transpose(Image.FLIP_LEFT_RIGHT)

# Show the original image
imageObject.show()

# Show the horizontal flipped image
hori_flippedImage.show()

輸出

原始影像

Original Image6

翻轉後的影像

Flipped Image

示例 2:垂直翻轉的影像

以下 Python 示例讀取影像,將其垂直翻轉,並使用標準 PNG 顯示實用程式顯示原始影像和翻轉後的影像 -

# import required image module
from PIL import Image

# Open an already existing image
imageObject = Image.open("images/spiderman.jpg")

# Do a flip of left and right
hori_flippedImage = imageObject.transpose(Image.FLIP_LEFT_RIGHT)

# Show the original image
imageObject.show()

# Show vertically flipped image
Vert_flippedImage = imageObject.transpose(Image.FLIP_TOP_BOTTOM)
Vert_flippedImage.show()

輸出

原始影像

Original Image6

翻轉後的影像

Flipped Image2

示例 3:將影像旋轉到特定角度

以下 Python 示例讀取影像,將其旋轉到指定角度,並使用標準 PNG 顯示實用程式顯示原始影像和旋轉後的影像 -

# import required image module
from PIL import Image

# Open an already existing image
imageObject = Image.open("images/spiderman.jpg")

# Do a flip of left and right
hori_flippedImage = imageObject.transpose(Image.FLIP_LEFT_RIGHT)

# Show the original image
imageObject.show()

#show 90 degree flipped image
degree_flippedImage = imageObject.transpose(Image.ROTATE_90)
degree_flippedImage.show()

輸出

原始影像

Original Image6

旋轉後的影像

Rotated Image2

Python Pillow - 調整影像大小

大多數數字影像都是畫素的二維平面,它具有寬度和高度。pillow 庫的 Image 模組具有一個屬性 size。此元組包含影像的寬度和高度作為其元素。要調整影像大小,您可以透過提供寬度和高度來呼叫 pillow 的影像類的 resize() 方法。

調整大小並儲存調整大小的影像

調整大小並儲存調整大小的影像的程式如下所示 -

#Import required Image library
from PIL import Image

#Create an Image Object from an Image
im = Image.open("images/cat.jpg")

#Display actual image
im.show()

#Make the new image half the width and half the height of the original image
resized_im = im.resize((round(im.size[0]*0.5), round(im.size[1]*0.5)))

#Display the resized imaged
resized_im.show()

#Save the cropped image
resized_im.save('resizedBeach1.jpg')

輸出

如果將上述程式儲存為 Example.py 並執行,它將使用標準 PNG 顯示實用程式顯示原始影像和調整大小後的影像,如下所示 -

原始影像

Original Image

調整大小後的影像

resized_image.jpg

Python Pillow - 建立水印

您已經注意到,一些線上照片帶有水印。水印絕對是保護您的影像免遭濫用的更好方法之一。此外,建議在社交媒體上分享您的創意照片之前,為其新增水印,以防止其被濫用。

水印通常是在照片上疊加的一些文字或徽標,用於識別拍攝照片的人或擁有照片版權的人。

Pillow 包允許我們向影像新增水印。要向我們的影像新增水印,我們需要 pillow 包中的 **“Image”**、**“ImageDraw”** 和 **“ImageFont”** 模組。

“ImageDraw”模組增加了在新的或現有的影像上繪製二維圖形的功能。“ImageFont”模組用於載入點陣圖、TrueType 和 OpenType 字型檔案。

示例

以下 python 程式演示瞭如何使用 python pillow 向影像新增水印 -

#Import required Image library
from PIL import Image, ImageDraw, ImageFont

#Create an Image Object from an Image
im = Image.open('images/boy.jpg')
width, height = im.size

draw = ImageDraw.Draw(im)
text = "sample watermark"

font = ImageFont.truetype('arial.ttf', 36)
textwidth, textheight = draw.textsize(text, font)

# calculate the x,y coordinates of the text
margin = 10
x = width - textwidth - margin
y = height - textheight - margin

# draw watermark in the bottom right corner
draw.text((x, y), text, font=font)
im.show()

#Save watermarked image
im.save('images/watermark.jpg')

輸出

假設,以下是在影像資料夾中找到的輸入影像 **boy.jpg**。

Boy

執行上述程式後,如果觀察輸出資料夾,您會看到結果 watermark.jpg 檔案在其上帶有水印,如下所示 -

Watermark

Python Pillow - 為影像新增濾鏡

**ImageFilter 模組** 包含預定義濾鏡集的定義,我們將其與 Image.filter() 方法一起使用。這些濾鏡用於更改影像的外觀和風格。

示例

以下示例是過濾影像 -

from PIL import Image, ImageFilter

im = Image.open('jungleSaf2.jpg')

im1 = im.filter(ImageFilter.BLUR)
im1.show()

im2 = im.filter(ImageFilter.MinFilter(3))
im2.show()

im3 = im.filter(ImageFilter.MinFilter) # same as MinFilter(3)
im3.show()

在上面的程式中,我們使用了 **MinFilter()** 方法,該方法用於建立最小濾鏡。它在給定大小的視窗中選擇最低的畫素值。

ImageFilter.MinFilter(size=3)

其中,

**size** - 核心大小(以畫素為單位)。

輸出

如果儲存上述程式並執行,它將顯示原始影像、模糊影像以及使用標準 PNG 顯示實用程式應用了 MinFilter 的模糊影像,如下所示 -

原始影像

Original Images

模糊影像

Blurred Image6

使用最小濾鏡模糊的影像

Image Blurred With Mini Filter

濾鏡

pillow 庫的當前版本提供了以下提到的預定義影像增強濾鏡集。

  • BLUR

  • CONTOUR

  • DETAIL

  • EDGE_ENHANCE

  • EDGE_ENHANCE_MORE

  • EMBOSS

  • FIND_EDGES

  • SHARPEN

  • SMOOTH

  • SMOOTH_MORE

示例

以下 python 示例將模糊濾鏡應用於影像,並將其儲存並使用標準 PNG 顯示實用程式顯示 -

#Import required image modules
from PIL import Image, ImageFilter

#Import all the enhancement filter from pillow

from PIL.ImageFilter import (
   BLUR, CONTOUR, DETAIL, EDGE_ENHANCE, EDGE_ENHANCE_MORE,
   EMBOSS, FIND_EDGES, SMOOTH, SMOOTH_MORE, SHARPEN
)

#Create image object
img = Image.open('images/cat.jpg')
#Applying the blur filter
img1 = img.filter(BLUR)
img1.save('images/ImageFilter_blur.jpg')
img1.show()

輸出

Image Filter

同樣,您可以將以下任何引數傳遞給 **image.filter()** 方法以獲取相應的輸出 -

  • CONTOUR

  • DETAIL

  • EDGE_ENHANCE

  • EDGE_ENHANCE_MORE

  • EMBOSS

  • FIND_EDGES

  • SMOOTH

  • SMOOTH_MORE

  • SHARPEN

Python img.filter(CONTOUR) 方法

以下 python 示例將 CONTOUR 濾鏡應用於給定影像。

示例

#Import required image modules
from PIL import Image, ImageFilter

#Import all the enhancement filter from pillow
from PIL.ImageFilter import (
   BLUR, CONTOUR, DETAIL, EDGE_ENHANCE, EDGE_ENHANCE_MORE,
   EMBOSS, FIND_EDGES, SMOOTH, SMOOTH_MORE, SHARPEN
)
#Create image object
img = Image.open('images/cat.jpg')
#Applying the blur filter
img1 = img.filter(CONTOUR)
img1.save('images/ImageFilter_blur.jpg')
img1.show()

輸出

如果儲存上述程式並執行,它將顯示原始影像和過濾後的影像,使用標準 PNG 顯示實用程式,如下所示 -

原始影像

Original Image

過濾後的影像

Filtered Image

Python img.filter(DETAIL) 方法

以下 python 示例將 DETAIL 濾鏡應用於給定影像。

示例

#Import required image modules
from PIL import Image, ImageFilter

#Import all the enhancement filter from pillow
from PIL.ImageFilter import (
   BLUR, CONTOUR, DETAIL, EDGE_ENHANCE, EDGE_ENHANCE_MORE,
   EMBOSS, FIND_EDGES, SMOOTH, SMOOTH_MORE, SHARPEN
)
#Create image object
img = Image.open('images/cat.jpg')
#Applying the blur filter
img1 = img.filter(DETAIL)
img1.save('images/ImageFilter_blur.jpg')
img1.show()

輸出

如果儲存上述程式並執行,它將顯示原始影像和過濾後的影像,使用標準 PNG 顯示實用程式,如下所示 -

原始影像

Original image

過濾後的影像

Filtered Image1

Python img.filter(EDGE_ENHANCE) 方法

以下 python 示例將 EDGE_ENHANCE 濾鏡應用於給定影像 -

示例

#Import required image modules
from PIL import Image, ImageFilter

#Import all the enhancement filter from pillow
from PIL.ImageFilter import (
   BLUR, CONTOUR, DETAIL, EDGE_ENHANCE, EDGE_ENHANCE_MORE,
   EMBOSS, FIND_EDGES, SMOOTH, SMOOTH_MORE, SHARPEN
)
#Create image object
img = Image.open('images/cat.jpg')
#Applying the blur filter
img1 = img.filter(EDGE_ENHANCE)
img1.save('images/ImageFilter_blur.jpg')
img1.show()

輸出

如果儲存上述程式並執行,它將顯示原始影像和過濾後的影像,使用標準 PNG 顯示實用程式,如下所示 -

原始影像

Orignal Image

過濾後的影像

Filtered Image2

Python img.filter(EDGE_ENHANCE_MORE) 方法

以下 python 示例將 EDGE_ENHANCE_MORE 濾鏡應用於給定影像。

示例

#Import required image modules
from PIL import Image, ImageFilter

#Import all the enhancement filter from pillow
from PIL.ImageFilter import (
   BLUR, CONTOUR, DETAIL, EDGE_ENHANCE, EDGE_ENHANCE_MORE,
   EMBOSS, FIND_EDGES, SMOOTH, SMOOTH_MORE, SHARPEN
)
#Create image object
img = Image.open('images/cat.jpg')
#Applying the blur filter
img1 = img.filter(EDGE_ENHANCE_MORE)
img1.save('images/ImageFilter_blur.jpg')
img1.show()

輸出

如果儲存上述程式並執行,它將顯示原始影像和過濾後的影像,使用標準 PNG 顯示實用程式,如下所示 -

原始影像

Original Image

過濾後的影像

Filtered Image3

Python img.filter(EMBOSS) 方法

以下 python 示例將 EMBOSS 濾鏡應用於給定影像。

示例

#Import required image modules
from PIL import Image, ImageFilter

#Import all the enhancement filter from pillow
from PIL.ImageFilter import (
   BLUR, CONTOUR, DETAIL, EDGE_ENHANCE, EDGE_ENHANCE_MORE,
   EMBOSS, FIND_EDGES, SMOOTH, SMOOTH_MORE, SHARPEN
)
#Create image object
img = Image.open('images/cat.jpg')
#Applying the blur filter
img1 = img.filter(EMBOSS)
img1.save('images/ImageFilter_blur.jpg')
img1.show()

輸出

如果儲存上述程式並執行,它將顯示原始影像和過濾後的影像,使用標準 PNG 顯示實用程式,如下所示 -

原始影像

Original Image

過濾後的影像

Filtered Image4

Python img.filter(FIND_EDGES) 方法

以下 python 示例將 FIND_EDGES 濾鏡應用於給定影像。

示例

#Import required image modules
from PIL import Image, ImageFilter

#Import all the enhancement filter from pillow
from PIL.ImageFilter import (
   BLUR, CONTOUR, DETAIL, EDGE_ENHANCE, EDGE_ENHANCE_MORE,
   EMBOSS, FIND_EDGES, SMOOTH, SMOOTH_MORE, SHARPEN
)
#Create image object
img = Image.open('images/cat.jpg')
#Applying the blur filter
img1 = img.filter(FIND_EDGES)
img1.save('images/ImageFilter_blur.jpg')
img1.show()

輸出

如果儲存上述程式並執行,它將顯示原始影像和過濾後的影像,使用標準 PNG 顯示實用程式,如下所示 -

原始影像

Original Image

過濾後的影像

Filtered Image5

Python img.filter(SMOOTH) 方法

以下 python 示例將 SMOOTH 濾鏡應用於給定影像。

示例

#Import required image modules
from PIL import Image, ImageFilter

#Import all the enhancement filter from pillow
from PIL.ImageFilter import (
   BLUR, CONTOUR, DETAIL, EDGE_ENHANCE, EDGE_ENHANCE_MORE,
   EMBOSS, FIND_EDGES, SMOOTH, SMOOTH_MORE, SHARPEN
)
#Create image object
img = Image.open('images/cat.jpg')
#Applying the blur filter
img1 = img.filter(SMOOTH)
img1.save('images/ImageFilter_blur.jpg')
img1.show()

輸出

如果儲存上述程式並執行,它將顯示原始影像和過濾後的影像,使用標準 PNG 顯示實用程式,如下所示 -

原始影像

Original Image

過濾後的影像

Filtered Image6

Python img.filter(SHARPEN) 方法

以下 python 示例將 SHARPEN 濾鏡應用於給定影像。

示例

#Import required image modules
from PIL import Image, ImageFilter

#Import all the enhancement filter from pillow
from PIL.ImageFilter import (
   BLUR, CONTOUR, DETAIL, EDGE_ENHANCE, EDGE_ENHANCE_MORE,
   EMBOSS, FIND_EDGES, SMOOTH, SMOOTH_MORE, SHARPEN
)
#Create image object
img = Image.open('images/cat.jpg')
#Applying the blur filter
img1 = img.filter(SHARPEN)
img1.save('images/ImageFilter_blur.jpg')
img1.show()

輸出

如果儲存上述程式並執行,它將顯示原始影像和過濾後的影像,使用標準 PNG 顯示實用程式,如下所示 -

原始影像

Original Image

過濾後的影像

Filtered Image7

以下 python 示例將 SHARPEN 濾鏡應用於給定影像。

示例

#Import required image modules
from PIL import Image, ImageFilter
#Import all the enhancement filter from pillow
from PIL.ImageFilter import (
   BLUR, CONTOUR, DETAIL, EDGE_ENHANCE, EDGE_ENHANCE_MORE,
   EMBOSS, FIND_EDGES, SMOOTH, SMOOTH_MORE, SHARPEN
)
#Create image object
img = Image.open('images/cat.jpg')
#Applying the blur filter
img1 = img.filter(SHARPEN)
img1.save('images/ImageFilter_blur.jpg')
img1.show()

輸出

如果儲存上述程式並執行,它將顯示原始影像和過濾後的影像,使用標準 PNG 顯示實用程式,如下所示 -

原始影像

Original Image

過濾後的影像

Filtered Image8

Python Pillow - 影像上的顏色

**ImageColor 模組** 包含以不同格式排列的顏色表,它還包含從 CSS3 樣式顏色說明符到 RGB 元組的轉換器。

顏色名稱

ImageColor 模組支援以下字串格式 -

  • 十六進位制顏色說明符,表示為 #rgb 或 #rrggbb。例如,#00ff00 表示純綠色。

  • #00ff00 十六進位制顏色,紅色值為 0(0% 紅色),綠色值為 255(100% 綠色),其 RGB 的藍色值為 0(0% 藍色)。

  • 圓柱座標表示(也稱為 HSL)的顏色 #00ff00 色相:0.33,飽和度:1.00,並且 00ff00 的亮度值為 0.50。

  • Image Color 模組提供了大約 140 種標準顏色名稱,基於 X 視窗系統和大多數 Web 瀏覽器支援的顏色。顏色名稱不區分大小寫。

ImageColor.getrgb() 方法

將顏色字串轉換為 RGB 元組。如果無法解析字串,則此函式將引發 ValueError 異常。

語法

PIL.ImageColor.getrgb(color)

其中,

  • 引數:color - 顏色字串

  • 返回值:(red, green, blue[, alpha])

示例 1

from PIL import ImageColor

# using getrgb
img = ImageColor.getrgb("blue")
print(img)

img1 = ImageColor.getrgb("purple")
print(img1)

輸出

(0, 0, 255)
(128, 0, 128)

示例 2

#Import required image modules
from PIL import Image,ImageColor

# Create new image & get color RGB tuple.
img = Image.new("RGB", (256, 256), ImageColor.getrgb("#add8e6"))

#Show image
img.show()

輸出

ImageColor getrgb

ImageColor.getcolor() 方法

此方法與 getrgb() 相同,但是如果模式不是圖形命令支援的形狀繪製和文字註釋顏色或調色盤影像,則會將 RGB 值轉換為灰度值。如果字串無法解析,則此函式引發 ValueError 異常。

語法

PIL.ImageColor.getcolor(color, mode)

其中,

  • 引數 - 顏色字串

  • 返回值 - (灰度級[, alpha]) 或 (紅色, 綠色, 藍色[, alpha])

示例

#Import required image modules
from PIL import Image,ImageColor

# using getrgb

img = ImageColor.getrgb("skyblue")
print(img)

img1 = ImageColor.getrgb("purple")
print(img1)

輸出

(135, 206, 235)
(128, 0, 128)

Python Pillow - ImageDraw 模組

'ImageDraw' 模組為 Image 物件提供了簡單的 2D 圖形支援。通常,我們使用此模組來建立新影像、註釋或修飾現有影像以及為 Web 使用動態生成圖形。

圖形命令支援繪製形狀和註釋文字。

  • 可以將影像理解為畫素(影像元素)的二維陣列。畫素是支援的最小顏色點。

  • ImageDraw 使用的二維座標系的原點位於影像的左上角

  • 我們使用的 Pillow 顏色方案是 RGB。RGB 顏色表示和支援由ImageColor模組提供。

  • 點陣圖、OpenType 或 TrueType 是文字註釋可接受的字型。

  • 大多數繪圖命令可能需要一個邊界框引數,該引數指定要應用命令的影像區域。

  • 一系列座標可以表示為 [ (x0, y0), (x1, y1),…(xn, yn)]。

  • 對於某些繪圖命令,我們需要角度值。

示例

以下 Python 示例在給定影像上繪製一條線 -

#Import required libraries
import sys
from PIL import Image, ImageDraw

#Create Image object
im = Image.open("images/logo.jpg")

#Draw line
draw = ImageDraw.Draw(im)
draw.line((0, 0) + im.size, fill=128)
draw.line((0, im.size[1], im.size[0], 0), fill=128)

#Show image
im.show()

輸出

如果將上述程式儲存為 Example.py 並執行,它將在影像上繪製一條線,並使用標準 PNG 顯示實用程式顯示它,如下所示 -

Utility

畫布

  • ImageDraw 是 Image 的 Pillow 可繪製表面(即畫布)。

  • ImageDraw.Draw(img) 返回 Image 引數 img 的可繪製畫布表示。畫布的背景是“img”影像。

示例

以下 Python 示例在給定影像上繪製文字 -

#Import required modules from Pillow package
from PIL import Image, ImageDraw, ImageFont

# get an image
base = Image.open('images/boy.jpg').convert('RGBA')

# make a blank image for the text, initialized to transparent text color
txt = Image.new('RGBA', base.size, (255,255,255,0))

# get a font
fnt = ImageFont.truetype('E:/PythonPillow/Fonts/Pacifico.ttf', 40)

# get a drawing context
d = ImageDraw.Draw(txt)

# draw text, half opacity
d.text((14,14), "Tutorials", font=fnt, fill=(255,255,255,128))

# draw text, full opacity
d.text((14,60), "Point", font=fnt, fill=(255,255,255,255))
out = Image.alpha_composite(base, txt)

#Show image
out.show()

輸出

Canvas

使用 'ImageDraw' 模組繪製形狀

ImageDraw 模組允許我們透過首先使用要處理的影像建立繪圖物件,然後應用它來建立不同的形狀。我們可以使用 'ImageDraw' 模組繪製的一些常見形狀如下 -

線條

以下是使用 Python Pillow 繪製線條的語法 -

draw.line(xy, fill=None, width=0)

line() 方法在邊界框 xy 和畫布上從左上角到右下角繪製一條線。線條使用顏色填充填充。引數 fill 和 width 是可選的,其預設值分別為 None 和 0。

示例

from PIL import Image, ImageDraw

img = Image.new('RGB', (500, 300), (125, 125, 125))
draw = ImageDraw.Draw(img)
draw.line((200, 100, 300, 200), fill=(0, 0, 0), width=10)

img.show()

輸出

Line

橢圓

以下是使用 Python Pillow 繪製橢圓的語法 -

draw.ellipse(xy, fill=None, outline=None)

ellipse() 方法在 draw 上繪製由邊界框 xy 包圍的橢圓。形狀使用顏色填充填充,周長使用顏色輪廓填充。引數 fill 和 width 是可選的,其預設值為 None。

示例

from PIL import Image, ImageDraw

img = Image.new('RGB', (500, 300), (125, 125, 125))
draw = ImageDraw.Draw(img)

draw.ellipse((200, 125, 300, 200), fill=(255, 0, 0), outline=(0, 0, 0))
img.show()

輸出

Ellipse

矩形

以下是使用 Python Pillow 繪製矩形的語法 -

draw.rectangle(xy, fill=None, outline=None)

rectangle() 方法在 draw 上繪製給定的邊界框 xy 矩形。形狀使用顏色填充填充,周長使用顏色輪廓填充。引數 fill 和 width 是可選的,其預設值為 None。

from PIL import Image, ImageDraw

img = Image.new('RGB', (500, 300), (125, 125, 125))
draw = ImageDraw.Draw(img)

draw.rectangle(
   (200, 125, 300, 200),
   fill=(255, 0, 0),
   outline=(0, 0, 0))
img.show()

輸出

Rectangle

多邊形

以下是使用 Python Pillow 繪製矩形的語法 -

draw.polygon(seq, fill=None, outline=None)

polygon() 方法在 draw 上繪製一個多邊形,該多邊形用直線連線座標序列位置 seq。seq 中的第一個和最後一個座標也由直線連線。形狀使用顏色填充填充,周長使用顏色輪廓填充。引數 fill 和 outline 是可選的,預設值為 None。

from PIL import Image, ImageDraw

img = Image.new('RGB', (500, 300), (125, 125, 125))
draw = ImageDraw.Draw(img)

draw.polygon(
   ((200, 200), (300, 100), (250, 50)),
   fill=(255, 0, 0),
   outline=(0, 0, 0))
img.show()

輸出

Polygon

Python Pillow - 影像序列

Python 影像庫 (PIL) 包含一些對影像序列(動畫格式)的基本支援。FLI/FLC、GIF 和一些實驗性格式是受支援的序列格式。TIFF 檔案也可以包含多個幀。

開啟序列檔案時,PIL 會自動載入序列中的第一幀。要移動到不同的幀,可以使用 seek 和 tell 方法。

from PIL import Image
img = Image.open('bird.jpg')
#Skip to the second frame
img.seek(1)
try:
   while 1:
      img.seek(img.tell() + 1)
      #do_something to img
except EOFError:
   #End of sequence
   pass

輸出

raise EOFError
EOFError

如上所示,當序列結束時,您將獲得 EOFError 異常。

庫最新版本中的大多數驅動程式僅允許您跳轉到下一幀(如上例所示),要倒回檔案,您可能需要重新開啟它。

一個序列迭代器類

class ImageSequence:
   def __init__(self, img):
      self.img = img
   def __getitem__(self, ix):
      try:
         if ix:
            self.img.seek(ix)
         return self.img
      except EOFError:
         raise IndexError # end of sequence
for frame in ImageSequence(img):
   # ...do something to frame...

Python Pillow - 在影像上寫入文字

您可以透過傳遞文字的位置、文字本身和文字的顏色來在影像上寫入文字。我們可以向此方法傳遞多個其他引數。

示例

from PIL import Image, ImageDraw

img = Image.open(beach1.jpg')
d1 = ImageDraw.Draw(img)
d1.text((28, 36), "Hello, TutorialsPoint!", fill=(255, 0, 0))
img.show()
img.save("images/image_text.jpg")

輸入

Tutorials Point

輸出

如果將上述程式儲存為 Example.py 並執行,它將在其上新增給定的文字,並使用標準 PNG 顯示實用程式顯示它,如下所示 -

Tutorials Point1

選擇字型

有許多方法可以選擇用於在影像上寫入的字型。我們可以透過將完整路徑傳遞給函式來直接從系統載入字型,也可以使用 ImageFont 載入 TrueType 字型。

示例

from PIL import Image, ImageDraw, ImageFont

img = Image.open('images/logo.jpg')
d1 = ImageDraw.Draw(img)
myFont = ImageFont.truetype('E:/PythonPillow/Fonts/FreeMono.ttf', 40)
d1.text((0, 0), "Sample text", font=myFont, fill =(255, 0, 0))
img.show()
img.save("images/image_text.jpg")

輸出

Tutorials Point2

Python Pillow - 使用 Numpy 進行機器學習

在本章中,我們使用 numpy 使用 Python 影像庫 - “pillow” 儲存和處理影像資料。

在繼續本章之前,請以管理員模式開啟命令提示符,並在其中執行以下命令以安裝 numpy -

pip install numpy

注意 - 只有在安裝並更新了 PIP 後,此方法才有效。

從 Numpy 陣列建立影像

使用 PIL 建立 RGB 影像並將其儲存為 jpg 檔案。在以下示例中,我們將 -

  • 建立一個 150 x 250 畫素的陣列。

  • 用橙色填充陣列的左側一半。

  • 用藍色填充陣列的右側一半。

from PIL import Image
import numpy as np

arr = np.zeros([150, 250, 3], dtype=np.uint8)

arr[:,:100] = [255, 128, 0]

arr[:,100:] = [0, 0, 255]

img = Image.fromarray(arr)

img.show()

img.save("RGB_image.jpg")

輸出

Numpy Array

建立灰度影像

建立灰度影像與建立 RGB 影像略有不同。我們可以使用二維陣列來建立灰度影像。

from PIL import Image
import numpy as np

arr = np.zeros([150,300], dtype=np.uint8)

#Set grey value to black or white depending on x position
   for x in range(300):
      for y in range(150):
         if (x % 16) // 8 == (y % 16)//8:
            arr[y, x] = 0
         else:
            arr[y, x] = 255
img = Image.fromarray(arr)

img.show()

img.save('greyscale.jpg')

輸出

Greyscale

從影像建立 numpy 陣列

您可以將 PIL 影像轉換為 numpy 陣列,反之亦然。下面是一個演示相同內容的小程式。

示例

#Import required libraries
from PIL import Image
from numpy import array

#Open Image & create image object
img = Image.open('beach1.jpg')

#Show actual image
img.show()

#Convert an image to numpy array
img2arr = array(img)

#Print the array
print(img2arr)

#Convert numpy array back to image
arr2im = Image.fromarray(img2arr)

#Display image
arr2im.show()

#Save the image generated from an array
arr2im.save("array2Image.jpg")

輸出

如果將上述程式儲存為 Example.py 並執行 -

  • 它將顯示原始影像。

  • 顯示從中檢索到的陣列。

  • 將陣列轉換回影像並顯示它。

  • 由於我們使用了 show() 方法,因此影像將使用預設的 PNG 顯示實用程式顯示,如下所示。

[[[ 0 101 120]
[ 3 108 127]
[ 1 107 123]
...
...
[[ 38 59 60]
[ 37 58 59]
[ 36 57 58]
...
[ 74 65 60]
[ 59 48 42]
[ 66 53 47]]
[[ 40 61 62]
[ 38 59 60]
[ 37 58 59]
...
[ 75 66 61]
[ 72 61 55]
[ 61 48 42]]
[[ 40 61 62]
[ 34 55 56]
[ 38 59 60]
...
[ 82 73 68]
[ 72 61 55]
[ 63 52 46]]]

原始影像

Original Image

從陣列構建的影像

Constructed
廣告