有些時(shí)候秧耗,我們不僅要對(duì)一張圖片進(jìn)行處理,可能還會(huì)對(duì)一批圖片處理舶治。這時(shí)候分井,我們可以通過循環(huán)來執(zhí)行處理车猬,也可以調(diào)用程序自帶的圖片集合來處理。
圖片集合函數(shù)為:
skimage.io.ImageCollection(load_pattern, load_func=None)
這個(gè)函數(shù)是放在io模塊內(nèi)的尺锚,帶兩個(gè)參數(shù)珠闰,第一個(gè)參數(shù)load_pattern, 表示圖片組的路徑,可以是一個(gè)str字符串瘫辩。第二個(gè)參數(shù)load_func是一個(gè)回調(diào)函數(shù)伏嗜,我們對(duì)圖片進(jìn)行批量處理就可以通過這個(gè)回調(diào)函數(shù)實(shí)現(xiàn)》パ幔回調(diào)函數(shù)默認(rèn)為imread()承绸,即默認(rèn)這個(gè)函數(shù)是批量讀取圖片。
比如我們可以利用它將一組圖片讀入:
from skimage import io, data_dir
data_path_str = data_dir + '/*.png'
images = io.ImageCollection(data_path_str)
print(len(images))
顯示結(jié)果為24, 說明系統(tǒng)自帶了24張png的示例圖片弧械,這些圖片都讀取了出來八酒,放在圖片集合images里。如果我們想顯示其中一張圖片刃唐,則可以在后加上兩行代碼:
io.imshow(images[1])
io.show()
顯示結(jié)果:
如果一個(gè)文件夾里羞迷,我們既存放了一些jpg格式的圖片,又存放了一些png格式的圖片画饥,現(xiàn)在想把它們?nèi)孔x取出來衔瓮,該怎么做呢?
import skimage.io as io
from skimage import data_dir
str='d:/pic/*.jpg:d:/pic/*.png'
coll = io.ImageCollection(str)
print(len(coll))
注意這個(gè)地方'd:/pic/.jpg:d:/pic/.png' ,是兩個(gè)字符串合在一起的抖甘,第一個(gè)是'd:/pic/.jpg', 第二個(gè)是'd:/pic/.png' 热鞍,合在一起后,中間用冒號(hào)來隔開衔彻,這樣就可以把d:/pic/文件夾下的jpg和png格式的圖片都讀取出來薇宠。如果還想讀取存放在其它地方的圖片,也可以一并加進(jìn)去艰额,只是中間同樣用冒號(hào)來隔開澄港。
io.ImageCollection()
這個(gè)函數(shù)省略第二個(gè)參數(shù),就是批量讀取柄沮。如果我們不是想批量讀取回梧,而是其它批量操作,如批量轉(zhuǎn)換為灰度圖祖搓,那又該怎么做呢狱意?
那就需要先定義一個(gè)函數(shù),然后將這個(gè)函數(shù)作為第二個(gè)參數(shù)拯欧,如:
from skimage import io, data_dir, color
def convert_to_gray(f, **args):
image = io.imread(f)
image = color.rgb2gray(image)
return image
data_path = data_dir + '/*.png'
collections = io.ImageCollection(data_path, load_func=convert_to_gray)
io.imshow(collections[1])
io.show()
這種批量操作對(duì)視頻處理是極其有用的详囤,因?yàn)橐曨l就是一系列的圖片組合
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這個(gè)視頻中每隔10幀的圖片讀取出來镐作,放在圖片集合中纬纪。
得到圖片集合以后恩闻,我們還可以將這些圖片連接起來辕漂,構(gòu)成一個(gè)維度更高的數(shù)組,連接圖片的函數(shù)為:
skimage.io.concatenate_images(ic)
帶一個(gè)參數(shù)跃惫,就是以上的圖片集合靶庙,如:
from skimage import data_dir,io,color
coll = io.ImageCollection('d:/pic/*.jpg')
mat=io.concatenate_images(coll)
使用concatenate_images(ic)函數(shù)的前提是讀取的這些圖片尺寸必須一致问畅,否則會(huì)出錯(cuò)。我們看看圖片連接前后的維度變化:
from skimage import data_dir, io, color
coll = io.ImageCollection('d:/pic/*.jpg')
print(len(coll)) #連接的圖片數(shù)量
print(coll[0].shape) #連接前的圖片尺寸六荒,所有的都一樣
mat=io.concatenate_images(coll)
print(mat.shape) #連接后的數(shù)組尺寸