目錄:
-
Python lmaging Library(PIL)是 python 下的圖像處理模塊,支持多種格式,並提供了強大的圖像處理功能,可以通過 pip 進行安裝。
-
PIL 模塊的官方版本只支持 Python2,pillow 完美支持 Python3
pillow
Pillow 是 PIL 的一個派生分支,但如今已經發展成爲比 PIL 本身更具活力的圖像處理庫。pillow 可以說已經取代了 PIL,將其封裝成python的庫(pip即可安裝),且支持 python2 和 python3
Pillow的Github主頁:https://github.com/python-pillow/Pillow
Pillow的文檔(對應版本v3.0.0):
https://pillow.readthedocs.org/en/latest/handbook/index.html
基本操作
# 下載安裝
pip install pillow
# python2
import Image
# python3(因爲是派生的PIL庫,所以要導入PIL中的Image)
from PIL import Image
# 打開圖像文件
im = Image.open('sample.jpg')
# 顯示圖像
im.show()
查看圖像信息
# 查看圖像的信息
print(im.format)
print(im.size) # 大小
# 查看圖像直方圖,圖像如果是 RGB 則返回三組數,如果是灰度圖則 返回一組數
print(im.histogram())
灰度直方圖是關於灰度級分佈的函數,是對圖像中灰度級分佈的統計。灰度直方圖是將數字圖像中的所有像素,按照灰度值的大小,統計其出現的頻率。灰度直方圖是灰度級的函數,它表示圖像中具有某種灰度級的像素的個數,反映了圖像中某種灰度出現的頻率。
查看圖像 像素值
# 讀取圖片的像素值
print(im.getpixel((100, 50))) # 100, 50 是指定圖片的位置的顏色 像素值
# 如果說彩色圖像 那麼返回的就是一個元組
(124, 126, 123) # 紅綠藍 顏色的三個分量
# 如果是 灰度圖像那麼返回的就是一個數值
87
# 設置像素值
im.putpixel((100, 50), (128, 30, 120)) # 設置該圖片指定位置的 RGB 顏色值
# 如果是灰度圖像 那麼只需要設置一個值
圖像保存
# 保存圖像文件
im.save('新名字.jpg')
# 轉換圖像格式
im.save('名字.你改的格式')
圖像的樣式轉換
# 圖像縮放
im_1 = im.resize((100, 100)) # 返回的是新圖像,我們需要保存下來
# 逆時針旋轉圖像,rotate 方法支持任意角度的旋轉,
# 而transpose方法支持部份特殊角度的旋轉,如 90、180、270以及水平、垂直翻轉
im_2 = im.rotate(90) # l < 0 < r
im_3 = im.transpose(Image.ROTATE_180)
im_3 = im.transpose(Image.FLIP_LEFT_RIGHT) # 左右水平 旋轉
im_3 = im.transpose(Image.FLIP_TOP_BOTTOm) # 上下水平 翻轉
圖像的裁剪與粘貼
from PIL import Image
im = Image.open('sample.jpg')
box = (120, 194, 220, 294)
# 在原圖片將 box 區域裁剪下來
region = im.crop(box) # region也是 img 對象哦,所以就可以使用 圖像對象的所有方法 ↓ 例
# 將裁剪下來的圖片 翻轉180 (倒過來了)
region = region.transpose(Image_ROTATE_180)
# 原圖片粘貼: 翻轉後的圖片 粘貼到 原圖片的 box 區域上 注: 這裏是粘貼,不是修補
im.paste(region, box)
im.show()
putpixel 實現隨即色的圖片
我們先用畫圖(mspaint) 生成 一個白板,當然 Pillow也可以生成 我們後期再說。
這麼大的就行,然後保存 命名爲 test.bmp 圖像
開工
from PIL import Image
from random import randint
img = Image.open('test.bmp')
for w in range(200, 280): # 這裏是設置圖形的寬度 範圍
for h in range(100 ,200): # 這裏是設置圖形高度 範圍
r = randint(0, 255) # 取值 0-255 隨機數的值 作爲顏色值
g = randint(0, 255)
b = randint(0, 255)
img.putpixel((w, h), (r, g, b)) # 設置指定範圍的顏色值
img.show()
結果
接下來又有了新的需求,我們需要把 這個 圖像 右移 200px,且圖像一致。都是隨機生成的,像還原一個是基本不可能了。
思路解析:
- 將 源圖像的所有像素值 獲取出來,getpixel
- 獲取到的像素值和位置,寫到右面200px,putpixel
# 可以將 ↑ 的代碼拿下來改改
for w in range(200, 280):
for h in range(100, 200):
color = img.getpixel((w, h))
img.putpixel((w + 200, h), color)
img.show()
結果
我們查看 Image 的底層源碼,發現他可以支持這麼多的 圖像格式。
# 373
def preinit():
"""Explicitly load standard file format drivers."""
global _initialized
if _initialized >= 1:
return
try:
from . import BmpImagePlugin
assert BmpImagePlugin
except ImportError:
pass
try:
from . import GifImagePlugin
assert GifImagePlugin
except ImportError:
pass
try:
from . import JpegImagePlugin
assert JpegImagePlugin
except ImportError:
pass
try:
from . import PpmImagePlugin
assert PpmImagePlugin
except ImportError:
pass
try:
from . import PngImagePlugin
assert PngImagePlugin
except ImportError:
pass
# try:
# import TiffImagePlugin
# assert TiffImagePlugin
# except ImportError:
# pass
_initialized = 1