文章一覽
- 前言
- 一、PIL圖像處理庫簡介
- 二、基本概念
- 2.1顏色模型
- 2.1.1 RGB 顏色模型
- 2.1.2 CMY色彩空間
- 2.2 通道
- 2.3 圖像數據
- 2.4 模式
- 三、用PIL做圖像處理
- 3.1 圖像縮放、翻轉等處理
- 3.1.1 圖像縮放處理
- 3.1.2 圖像旋轉處理
- (1)PIL 提供的函數:
- (2)利用numpy數組處理
- 3.2 調整亮度
- 3.3 圖像高度裁剪
- 3.4 圖像過濾
- 3.5圖像增強
前言
在這個視覺至上的時代,圖像已成為我們日常生活中不可或缺的一部分。無論是社交媒體上的分享,還是專業領域的圖像分析,圖像處理技術都扮演著至關重要的角色。但你是否曾想過,如何將這些靜態的圖像轉化為動態的故事,或者從海量的圖像數據中提取出有價值的信息?這正是Python圖像處理庫——PIL(Python Imaging Library)的神奇之處。
歡迎進入PIL的世界,這里是創意與技術的交匯點。
PIL庫不僅僅是一個工具集,它是一個強大的盟友,幫助你解鎖圖像處理的無限可能。從基本的圖像編輯到復雜的圖像分析,PIL庫以其簡潔的API和強大的功能,讓圖像處理變得輕松而高效。無論是調整圖片大小、應用濾鏡效果,還是進行圖像識別和機器學習,PIL庫都能助你一臂之力。
隨著我們深入探索PIL庫的奧秘,你將發現,它不僅能夠增強你的圖像處理能力,還能夠激發你的創造力,讓你在圖像的世界里自由翱翔。讓我們一起揭開PIL庫的神秘面紗,開啟一段圖像處理的奇妙旅程吧!
一、PIL圖像處理庫簡介
Python 中有關圖像處理的庫有很多,常見的有 PIL、cv2 等。在進行深度學習圖像任務的時候,常常會使用 PIL 這個庫來讀取和處理圖片
PIL(Python Imaging Library)庫是一個具有強大圖像處理能力的第三方庫,包含了豐富的像素、色彩等操作功能。
PIL 庫支持圖像存儲、顯示和處理,它能夠處理幾乎所有圖片格式,可以完成對圖像的縮放、裁剪、旋轉、濾鏡、疊加以及向圖像添加線條、圖像和文字等操作。
安裝:
在命令行模式下:pip install pillow
pip 如果版本低,可升級更新:python -m pip install --upgrade pip
根據功能不同,PIL 庫共包括 21 個與圖片相關的類,這些類可以被看作是子庫或 PIL 庫中的模塊
Image、ImageChops、ImageColor、ImageCrackCode、Image Enhance、ImageDraw ImageFile、ImageFileIO、ImageFilter、Image Font、ImageGL、ImageGrab、Imagemath、ImageOps、ImagePalette、ImagePath、ImageQt、ImageSequence、ImageStat、ImageTk、ImageWin
Image 是 PIL 中最重要的模塊
? from PIL import Image
二、基本概念
PIL 中所涉及的基本概念有如下幾個:顏色模型、通道、模式、尺寸 等
2.1顏色模型
2.1.1 RGB 顏色模型
組成:紅?、綠(G)、藍(B),每個點三個分量(R,G,B)
通常可以將 r、g、b 分別規整化為【0,1】,當使用 8 bit進行存儲時,r、g、b通常取值為 [0,255] 內的整數
2.1.2 CMY色彩空間
CMY 是不同于 RGB 的另外一組基本色彩:Cyan(青)、Magenta(品紅)、Yellow(黃),分別是 R、G、B 的補色
比如:青 = 1 - 紅色,品紅 = 1- 綠色。CMY 稱為“減色系統”,而 RGB 稱為“加色系統”
RGB ——(0,0,0)為黑,(1,1,1)為白;值越大,顏色越亮
CMY ——(0,0,0)為白,(1,1,1)為黑,值越大,顏色越暗
2.2 通道
一幅彩色圖像包括三個通道:Red 通道,Green 通道和 Blue 通道
在圖像空間顯示出來就是三張圖片疊加起來,每張圖片對應一個通道。而對于黑白圖像,則只有 1 個通道
這張彩色圖像是如何存儲的?
在圖像空間顯示出來就是三張圖片疊加起來,每張圖片對應一個通道
2.3 圖像數據
#導入相應的模塊
import numpy as np
import matplotlib.pyplot as plt
# 隨機生成 300x400 的多維數組
img = np.random.random([300,400])
plt.imshow(img)
plt.show()
圖像的像素值可以用矩陣來表示,是一個由像素組成的二維矩陣,每個元素是一個 RGB 值
圖像數據可以轉換成 NumPy 中的數組元素
imshow() 功能:將數據顯示為圖像
- X:numpy 數組或 PIL 圖像
- cmap:此參數是顏色圖實例或注冊的顏色圖名稱
2.4 模式
圖像的 模式 定義了圖像的類型和像素的位寬。當前支持如下模式:
(1)1:1 位像素,表示黑和白,但是存儲的時候每個像素存儲為 8 bit
(2)L:8 位像素,表示黑和白
(3)P:8 位像素,使用調色板映射到其他模式
(4)RGB:3x8位像素,為真彩色
(5)RGBA:4x8 位像素,有透明通道的真彩色
(6)CMYK:4x8 位像素,顏色分離(出版圖像)
三、用PIL做圖像處理
圖像是一個由像素組成的二維矩陣,每個元素是一個 RGB 值:
- Image.open ():打開圖像
- image.show():顯示圖像
- image.save(<文件名>):保存圖像
- np.array():將圖像轉化為數組
- plt. imshow() :將數組顯示為圖像
注意: plt. imshow() 和 plt.show() 同時出現才能顯示圖像
import numpy as np
from PIL import Image
image = Image.open('cat.png')
image.show()
im = np.array (image)
print ('shape:',im.shape)
208 × 338 × 3: 3 代表通道信息
圖像數據是多維數組,前兩維表示了圖像的 高(行)、寬(列),第三維表示圖像通道的個數。如果是黑白圖像,默認1個通道
import numpy as np
from PIL import Image
image = Image.open('cat.png')
image = np.array (image)
print (image)
print ('shape:',image.shape)
print ('dtype:',image.dtype)
結果:
shape: (460, 724, 4)
dtype: uint8
查看數據形狀,其形狀是 [H, W, 3]
uint8,無符號整型。表示范圍是 [0, 255] 的整數,像素范圍是 [0,255],也可以歸一化到 [0,1]
用 PIL 獲取圖片 RGB 數值
# 用 PIL 獲取圖片 RGB 數值
from PIL import Image
im = Image.open('cat.png')
width = im.size[0]
height = im.size[1]
array = []
for x in range(5):for y in range(5):r, g, b = im.getpixel((x,y))rgb = (r, g, b)array.append(rgb)
print(array)
黑白圖像
import numpy as np
from PIL import Image
image = Image.open('cat1.png')
image.show()
im = np.array (image)
print ('shape:',im.shape)
結果:shape(208, 338)
如果是黑白圖像,默認1個通道
3.1 圖像縮放、翻轉等處理
from PIL import Image
im = Image.open ('cat.png')
im.show ()
圖像可以進行縮放、翻轉等操作
3.1.1 圖像縮放處理
兩種方法:
- 1、PIL 提供的函數;
- 2、因為圖像數據本質上就是 numpy 數組,因此可以通過對數組數據進行處理(比如切片操作)就可以實現對圖像的處理
from PIL import Image
img = Image.open('cat.png')
img = img.resize((104,169))
img.show()
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
img = Image.open('cat.png')
img = np.array(img)
img = img[0:120,100:250]
plt.imshow(img)
plt.show()
3.1.2 圖像旋轉處理
對圖像做旋轉處理有兩種方法:
(1)PIL 提供的函數:
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
img = Image.open('cat.png')
img = img.rotate(45)
img.show()
(2)利用numpy數組處理
因為圖像數據本質上就是 numpy 數組,因此可以通過對數組數據進行處理(比如切片操作)就可以實現對圖像的處理
上下翻轉
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
img = Image.open('cat.png')
image = np.array (img)
image = image[::-1, :, :]
plt.imshow(image)
plt.show()
左右翻轉
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
image = Image.open('體育館.png')
plt.imshow(image)
plt.show()
image = Image.open('體育館.png')
image1 = np.array (image)
image2 = image1[:, ::-1, :]
plt.imshow(image2)
plt.show()
3.2 調整亮度
image = Image.open('cat.png')
image = np.array (image)
image1 = image * 0.5
image1 = np.clip(image1,a_min=20, a_max=200.)
plt.imshow(image1.astype('uint8'))
plt.show()
np.clip(a, a_min, a_max):這個函數將數組中的元素限制在 a_min, a_max 之間,大于 a_max 的就使得它等于 a_max,小于 a_min,的就使得它等于 a_min
3.3 圖像高度裁剪
image = Image.open('cat.png')
image = np.array (image)
H,W = image.shape[0],image.shape[1]
H1 = H // 2
H2 = H
image = image[H1:H2, ::]
plt.imshow(image)
plt.show()
Image 的坐標好像是從左上開始的,0在左上
/ 是除法,例如:2/3 = 0.6666。而 // 是表示向下取整的除法,如 3 // 2 = 1,6.0 // 4 = 1
像素只能是整數,所以采用 // 除法
PIL庫的 ImageEnhance 和 ImageFilter 模塊提供了過濾圖像和增強圖像的方法
3.4 圖像過濾
ImageFilter 類的預定義過濾方法
方法表示 | 描述 |
---|---|
ImageFilter.BLUR | 圖像的模糊效果 |
ImageFilter.CONTOUR | 圖像的輪廓效果 |
ImageFilter.EDGE_ENHANCE | 圖像的邊界加強效果 |
ImageFilter.DETAIL | 圖像的細節效果 |
ImageFilter.EMBOSS | 圖像的浮雕效果 |
ImageFilter.SMOOTH | 圖像的平滑效果 |
ImageFilter.SHARPEN | 圖像的銳化效果 |
圖像模糊效果
import matplotlib.pyplot as plt
from PIL import Image, ImageFilter
im = Image.open('qe.png')
im = im.filter(ImageFilter.BLUR)
im.show()
圖像輪廓效果
import matplotlib.pyplot as plt
from PIL import Image, ImageFilter
im = Image.open('qe.png')
conF = im.filter(ImageFilter.CONTOUR)
conF.show()
3.5圖像增強
ImageEnhance 類提供了更高級的圖像增強功能,如調整色彩度、亮度、對比度、銳化等
方法表示 | 描述 |
---|---|
ImageEnhance.enhance(factor) | 對選擇屬性的數值增強factor倍 |
ImageEnhance.Color(im) | 調整圖像的顏色平衡 |
ImageEnhance.Contrast(im) | 調整圖像的對比度 |
ImageEnhance.Brightness(im) | 調整圖像的亮度 |
ImageEnhance.Sharpness(im) | 調整圖像的銳度 |