首頁 > 軟體

python數位影像處理之影象的批次處理

2022-06-28 22:01:58

正文

有些時候,我們不僅要對一張圖片進行處理,可能還會對一批圖片處理。這時候,我們可以通過迴圈來執行處理,也可以呼叫程式自帶的圖片集合來處理。

圖片集合函數

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數位影像批次處理的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com