python數字圖像處理之圖像的批量處理
正文
有些時候,我們不僅要對一張圖片進行處理,可能還會對一批圖片處理。這時候,我們可以通過循環來執行處理,也可以調用程序自帶的圖片集合來處理。
圖片集合函數
skimage.io.ImageCollection(load_pattern,load_func=None)
這個函數是放在io模塊內的,帶兩個參數,第一個參數load_pattern, 表示圖片組的路徑,可以是一個str字符串。第二個參數load_func是一個回調函數,我們對圖片進行批量處理就可以通過這個回調函數實現。回調函數默認為imread(),即默認這個函數是批量讀取圖片。
先看一個例子:
import skimage.io as io from skimage import data_dir str=data_dir + '/*.png' coll = io.ImageCollection(str) print(len(coll))
顯示結果為25, 說明系統自帶瞭25張png的示例圖片,這些圖片都讀取瞭出來,放在圖片集合coll裡。如果我們想顯示其中一張圖片,則可以在後加上一行代碼:
io.imshow(coll[10])
顯示為:
批量讀取
如果一個文件夾裡,我們既存放瞭一些jpg格式的圖片,又存放瞭一些png格式的圖片,現在想把它們全部讀取出來,該怎麼做呢?
import skimage.io as io from skimage import data_dir str='d:/pic/*.jpg:d:/pic/*.png' coll = io.ImageCollection(str) print(len(coll))
註意這個地方'd:/pic/*.jpg:d:/pic/*.png' ,是兩個字符串合在一起的,
第一個是'd:/pic/*.jpg',
第二個是'd:/pic/*.png' ,
合在一起後,中間用冒號來隔開,這樣就可以把d:/pic/文件夾下的jpg和png格式的圖片都讀取出來。
如果還想讀取存放在其它地方的圖片,也可以一並加進去,隻是中間同樣用冒號來隔開。
io.ImageCollection()這個函數省略第二個參數,就是批量讀取。如果我們不是想批量讀取,而是其它批量操作,如批量轉換為灰度圖,那又該怎麼做呢?
批量轉換為灰度圖
那就需要先定義一個函數,然後將這個函數作為第二個參數,如:
from skimage import data_dir,io,color def convert_gray(f): rgb=io.imread(f) return color.rgb2gray(rgb) str=data_dir+'/*.png' coll = io.ImageCollection(str,load_func=convert_gray) io.imshow(coll[10])
這種批量操作對視頻處理是極其有用的,因為視頻就是一系列的圖片組合
from skimage import data_dir,io,color class AVILoader: video_file = 'myvideo.avi' def __call__(self, frame): return video_read(self.video_file, frame) avi_load = AVILoader() frames = range(0, 1000, 10) # 0, 10, 20, ... ic =io.ImageCollection(frames, load_func=avi_load)
這段代碼的意思,就是將myvideo.avi這個視頻中每隔10幀的圖片讀取出來,放在圖片集合中。
得到圖片集合以後,我們還可以將這些圖片連接起來,構成一個維度更高的數組,連接圖片的函數為:
skimage.io.concatenate_images(ic)
帶一個參數,就是以上的圖片集合,如:
from skimage import data_dir,io,color coll = io.ImageCollection('d:/pic/*.jpg') mat=io.concatenate_images(coll)
使用concatenate_images(ic)函數的前提是讀取的這些圖片尺寸必須一致,否則會出錯。我們看看圖片連接前後的維度變化:
from skimage import data_dir,io,color coll = io.ImageCollection('d:/pic/*.jpg') print(len(coll)) #連接的圖片數量 print(coll[0].shape) #連接前的圖片尺寸,所有的都一樣 mat=io.concatenate_images(coll) print(mat.shape) #連接後的數組尺寸
顯示結果:
2
(870, 580, 3)
(2, 870, 580, 3)
可以看到,將2個3維數組,連接成瞭一個4維數組
如果我們對圖片進行批量操作後,想把操作後的結果保存起來,也是可以辦到的。
批量保存
例:把系統自帶的所有png示例圖片,全部轉換成256*256的jpg格式灰度圖,保存在d:/data/文件夾下
改變圖片的大小,我們可以使用tranform模塊的resize()函數,後續會講到這個模塊。
from skimage import data_dir,io,transform,color import numpy as np def convert_gray(f): rgb=io.imread(f) #依次讀取rgb圖片 gray=color.rgb2gray(rgb) #將rgb圖片轉換成灰度圖 dst=transform.resize(gray,(256,256)) #將灰度圖片大小轉換為256*256 return dst str=data_dir+'/*.png' coll = io.ImageCollection(str,load_func=convert_gray) for i in range(len(coll)): io.imsave('d:/data/'+np.str(i)+'.jpg',coll[i]) #循環保存圖片
結果:
以上就是python數字圖像處理之圖像的批量處理的詳細內容,更多關於python數字圖像批量處理的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- python數字圖像處理實現圖像的形變與縮放
- python數字圖像處理skimage讀取顯示與保存圖片
- Python opencv操作深入詳解
- opencv-python圖像處理安裝與基本操作方法
- Python生成字符視頻的實現示例