官术网_书友最值得收藏!

1.4 Python圖像處理工具之PIL

在Python中進(jìn)行圖像處理有PIL、OpenCV等工具。PIL是Python中常用的圖像處理工具,本書中我們使用PIL進(jìn)行圖像處理。本節(jié)詳細(xì)介紹圖像處理工具PIL。

1.4.1 PIL簡介

PIL是Python Imaging Library的簡稱,目前已經(jīng)是Python生態(tài)系統(tǒng)中圖像處理的標(biāo)準(zhǔn)庫。PIL之所以如此受歡迎,是因?yàn)樗墓δ芊浅?qiáng)大且API非常簡單、易用。PIL只支持Python 2.x版本,目前支持Python 3.x的是社區(qū)在PIL的基礎(chǔ)上Fork的版本,項(xiàng)目叫Pillow。

1.4.2 PIL接口詳解

下面我們會(huì)對PIL的常用接口進(jìn)行講解并給出示例代碼。

1.圖像讀寫

(1)從文件中讀取圖像數(shù)據(jù)

Image.open():本API提供了打開圖像文件和讀取圖像數(shù)據(jù)的功能。示例代碼如下:

        1.  from PIL import Image
        2.  with open("enjoy.jpg", "rb") as fp:
        3.  im = Image.open(fp)

(2)從壓縮文件中讀取圖像數(shù)據(jù)

TarIO():本API提供了tar文件的讀取功能,不用解壓縮就可以直接從tar文件中讀取圖像數(shù)據(jù)。

示例代碼如下:

        1.  from PIL import Image, TarIO
        2.  fp = TarIO.TarIO("enjoy.tar", "enjoy.jpg")
        3.  im = Image.open(fp)

(3)將圖像數(shù)據(jù)保存為JPEG格式

Image.save():本API提供了圖像數(shù)據(jù)的保存功能,可以保存成訓(xùn)練所需要的圖像格式。

示例代碼如下:

        1.  import os, sys
        2.  from PIL import Image
        3.
        4.  for infile in sys.argv[1:]:
        5.     f, e = os.path.splitext(infile)
        6.     outfile = f + ".jpg"
        7.     if infile ! = outfile:
        8.         try:
        9.            Image.open(infile).save(outfile)
        10.        except IOError:
        11.           print("cannot convert", infile)

2.圖像編輯

圖像編輯包含生成圖像縮略圖、圖像格式查詢和圖像截取幾種操作,尤其是圖像截取操作,是我們在編程中經(jīng)常需要做的。

(1)生成圖像縮略圖

在編程中我們有時(shí)會(huì)遇到圖像數(shù)據(jù)過大導(dǎo)致出現(xiàn)內(nèi)存或者顯存溢出的問題。im.thumbnai這個(gè)API提供了將圖像制作成縮略圖的功能,在不改變主要圖像特征的情況下對圖像進(jìn)行縮略變換,以減小圖像數(shù)據(jù)。

示例代碼如下:

        1.  import os, sys
        2.  from PIL import Image
        3.  #初始化縮略圖的尺寸
        4.  size = (128, 128)
        5.  #逐個(gè)讀取圖像并生成縮略圖保存
        6.  for infile in sys.argv[1:]:
        7.     #初始化縮略圖的保存路徑
        8.     outfile = os.path.splitext(infile)[0] + ".thumbnail"
        9.     if infile ! = outfile:
        10.        try:
        11.           #讀取圖像并進(jìn)行縮略轉(zhuǎn)換,最好保存縮略圖
        12.           im = Image.open(infile)
        13.           im.thumbnail(size)
        14.           im.save(outfile, "JPEG")
        15.        except IOError:
        16.            print("cannot create thumbnail for", infile)

(2)圖像格式查詢

在進(jìn)行圖像處理時(shí),我們需要查看或者判別圖像的格式,以防止出現(xiàn)因圖像格式不一致引起的錯(cuò)誤。im.format、im.size和im.mode這些API分別提供了圖像的格式、尺寸、色彩模式(RGB、L)信息的查詢功能。

示例代碼如下:

        1.  from PIL import Image
        2.  for infile in sys.argv[1:]:
        3.        with Image.open(infile) as im:
        4.            print(infile, im.format, "%dx%d" % im.size, im.mode)

(3)圖像截取

在實(shí)際業(yè)務(wù)場景中,我們獲得的圖像尺寸可能是不一樣的,而在進(jìn)行訓(xùn)練時(shí)需要數(shù)據(jù)維度是固定的。因此,在進(jìn)行訓(xùn)練前需要對數(shù)據(jù)進(jìn)行預(yù)處理,我們使用im.crop對圖像進(jìn)行截取以保持圖像的尺寸統(tǒng)一。

示例代碼如下:

        1.  from PIL import Image
        2.  file="enjoy.jpeg"
        3.  #讀取圖像數(shù)據(jù)
        4.  im=Image.open(file)
        5.  #初始化截取圖像的范圍
        6.  box = (100, 100, 400, 400)
        7.  #完成圖像的截取并保存圖像
        8.  im.crop(box)
        9.  im.save("enjoy_region.jpeg", JPEG)

3.圖像尺寸變換

im.resize()提供了圖像尺寸變換功能,可以按照需要變換源圖像的尺寸。im.rotate()提供了圖像旋轉(zhuǎn)功能,可以根據(jù)需要旋轉(zhuǎn)不同的角度。

示例代碼如下:

        1.  from PIL import Image
        2.  file="enjoy.jpeg"
        3.  im=Image.open(file)
        4.  im.resize((256,256)).rotate(90) #將圖像重置為256px×256px,然后旋轉(zhuǎn)90°
        5.  im.save("enjoy_rotate.jpeg", JPEG)

4.像素變換

(1)像素色彩模式變換

在實(shí)際工業(yè)生產(chǎn)中,通常需要對圖像進(jìn)行二值化,可以通過convert()對圖像進(jìn)行二值化處理。這個(gè)API提供了將圖像進(jìn)行像素色彩模式轉(zhuǎn)換的功能,可以在支持的像素色彩格式間進(jìn)行轉(zhuǎn)換。在人工智能算法編程中常用的是將RGB模式進(jìn)行二值化操作,示例代碼如下:

        1.  from PIL import Image
        2.  file="enjoy.jpeg"
        3.  #將圖像模式轉(zhuǎn)換為黑白模式
        4.  im=Image.open(file).convert("L")
        5.  im.save("enjoy_convert.jpeg", JPEG)

(2)像素對比度調(diào)節(jié)

在進(jìn)行圖像數(shù)據(jù)處理時(shí),為了增加圖像數(shù)據(jù)的特征,可以調(diào)節(jié)像素對比度。im.filter()提供了調(diào)節(jié)像素對比度的功能,通過調(diào)節(jié)訓(xùn)練文件的對比度來降低噪聲也是一種特征處理的手段。

示例代碼如下:

        1.  from PIL import Image
        2.  file="enjoy.jpeg"
        3.  im=Image.open(file)
        4.  im.filter(ImageFilter.DETAL)
        5.  im.save("enjoy_filter.jpeg", JPEG)

1.4.3 PIL圖像處理實(shí)踐

在日常圖像處理編程中,我們經(jīng)常會(huì)遇到需要對訓(xùn)練數(shù)據(jù)進(jìn)行文件格式轉(zhuǎn)換的情況,比如從JPG文件轉(zhuǎn)換為CIFAR-10文件,這樣可以提高對訓(xùn)練數(shù)據(jù)的讀取效率,并且為數(shù)據(jù)操作帶來更大的便捷性。下面是將正常JPG文件轉(zhuǎn)換為CIFAR-10文件的示例代碼:

    1.  # -*- coding:utf-8-*-
    2.  import pickle, pprint
    3.  from PIL import Image
    4.  import numpy as np
    5.  import os
    6.  #在開始編程之前需要導(dǎo)入依賴包,比如PIL、numpy等
    7.  class DictSave(object):
    8.     #定義方法類
    9.     def __init__(self, filenames, file):
    10.        self.filenames = filenames
    11.        self.file=file
    12.        self.arr = []
    13.        self.all_arr = []
    14.        self.label=[]
    15.     #定義圖像輸入函數(shù)
    16.     def image_input(self, filenames, file):
    17.           i=0
    18.           for filename in filenames:
    19.             self.arr, self.label = self.read_file(filename, file)
    20.             if self.all_arr==[]:
    21.                self.all_arr = self.arr
    22.             else:
    23.               self.all_arr = np.concatenate((self.all_arr, self.arr))
    24.
    25.             print(i)
    26.             i=i+1
    27.     #定義文件讀取函數(shù)
    28.     def read_file(self, filename, file):
    29.           im = Image.open(filename) #打開一個(gè)圖像
    30.           #將圖像的RGB分離
    31.           r, g, b = im.split()
    32.           #將PILLOW圖像轉(zhuǎn)成數(shù)組
    33.           r_arr = plimg.pil_to_array(r)
    34.           g_arr = plimg.pil_to_array(g)
    35.           b_arr = plimg.pil_to_array(b)
    36.
    37.           #將3個(gè)一維數(shù)組合并成一個(gè)一維數(shù)組,大小為32400
    38.           arr = np.concatenate((r_arr, g_arr, b_arr))
    39.           label=[]
    40.           for i in file:
    41.              label.append(i[0])
    42.           return arr, label
    43.     def pickle_save(self, arr, label):
    44.           print ("正在存儲(chǔ)")
    45.           #構(gòu)造字典,所有的圖像數(shù)據(jù)都在arr數(shù)組里,這里只存儲(chǔ)圖像數(shù)據(jù),沒
                  有存儲(chǔ)label
    46.           contact = {'data': arr, 'label':label}
    47.           f = open('data_batch', 'wb')
    48.
    49.           pickle.dump(contact, f) #把字典保存到文本中
    50.           f.close()
    51.           print ("存儲(chǔ)完畢")
    52. if __name__ == "__main__":
    53.    file_dir='train_data'
    54.    L=[]
    55.    F=[]
    56.    for root, dirs, files in os.walk(file_dir):
    57.     for file in files:
    58.        if os.path.splitext(file)[1] == '.jpg':
    59.          L.append(os.path.join(root, file))
    60.          F.append(file)
    61.
    62.    ds = DictSave(L, F)
    63.    ds.image_input(ds.filenames, ds.file)
    64.    print(ds.all_arr)
    65.    ds.pickle_save(ds.all_arr, ds.label)
    66.    print ("最終數(shù)組的大小:"+str(ds.all_arr.shape))
主站蜘蛛池模板: 定陶县| 双峰县| 朔州市| 金湖县| 江津市| 察雅县| 黑水县| 美姑县| 阳春市| 毕节市| 黄平县| 九江市| 万荣县| 固阳县| 绥德县| 通山县| 如东县| 营口市| 栾城县| 乌什县| 南木林县| 克山县| 通州区| 四川省| 杭锦后旗| 盐亭县| 祁连县| 泌阳县| 称多县| 松阳县| 晴隆县| 鲜城| 岳阳市| 东台市| 潍坊市| 班戈县| 娄烦县| 绥中县| 克山县| 郴州市| 光山县|