有些時候,我們不僅要對一張圖片進行處理,可能還會對一批圖片處理,有如下兩種方法:
- 通過循環來執行處理
- 調用程序自帶的圖片集合來處理
對於第二種方法,用到的圖片集合函數為
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))
顯示結果為27, 説明系統自帶了27張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))
結果為:5
注意這個地方'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])
結果如下圖所示:
這種批量操作對視頻處理是極其有用的,因為視頻就是一系列的圖片組合。我們也可以對圖片進行批量操作後,想把操作後的結果保存起來。
例:把系統自帶的所有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]) #循環保存圖片
結果如下所示:
轉載於: