- 走向TensorFlow 2.0:深度學(xué)習(xí)應(yīng)用編程快速入門
- 趙英俊
- 1832字
- 2020-04-03 12:56:47
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))
- Advanced Splunk
- Mobile Web Performance Optimization
- Learning Informatica PowerCenter 10.x(Second Edition)
- 從0到1:HTML+CSS快速上手
- JavaScript動(dòng)態(tài)網(wǎng)頁開發(fā)詳解
- Quantum Computing and Blockchain in Business
- JavaScript腳本特效編程給力起飛
- Hadoop 2.X HDFS源碼剖析
- Python函數(shù)式編程(第2版)
- Visual C++從入門到精通(第2版)
- Java Web開發(fā)教程:基于Struts2+Hibernate+Spring
- Flink核心技術(shù):源碼剖析與特性開發(fā)
- React.js實(shí)戰(zhàn)
- Android項(xiàng)目實(shí)戰(zhàn):博學(xué)谷
- Mastering PostgreSQL 11(Second Edition)