2 回答

TA貢獻1911條經(jīng)驗 獲得超7個贊
我將簡要介紹該線程的主要要點:
最快的常用圖像讀取功能
imread
來自cv2
包。讀取圖像然后將它們添加到一個普通的 Python 列表中(正如您已經(jīng)在做的那樣)是讀取大量圖像的最快方法。
然而,鑒于您最終將圖像列表轉(zhuǎn)換為圖像數(shù)組,構(gòu)建圖像數(shù)組的每種可能方法幾乎與任何其他方法一樣快
盡管有趣的是,如果您采用直接將圖像分配給預分配數(shù)組的方法,實際上分配給哪個索引(即哪個維度)對于獲得最佳性能很重要。
所以基本上,在純單線程 Python 中工作時,您將無法獲得更快的速度。您可能會從切換到cv2.imread
(代替PIL.Image.open
)獲得提升。

TA貢獻1780條經(jīng)驗 獲得超1個贊
PNG 是一種非常慢的格式,因此如果您幾乎可以使用其他任何格式,您將看到明顯的加速。
例如,這是您的程序的 opencv 版本,它從命令行參數(shù)獲取文件名:
#!/usr/bin/python3
import sys
import cv2
import numpy as np
video_array = []
for filename in sys.argv[1:]:
im = cv2.imread(filename)
video_array.append(np.asarray(im))
video_array = np.array(video_array)
print(video_array.shape)
我可以像這樣運行它:
$ mkdir sample
$ for i in {1..100}; do cp ~/pics/k2.png sample/$i.png; done
$ time ./readframes.py sample/*.png
(100, 2048, 1450, 3)
real 0m6.063s
user 0m5.758s
sys 0m0.839s
所以 6s 讀取 100 張 PNG 圖像。如果我嘗試使用 TIFF:
$ for i in {1..100}; do cp ~/pics/k2.tif sample/$i.tif; done
$ time ./readframes.py sample/*.tif
(100, 2048, 1450, 3)
real 0m1.532s
user 0m1.060s
sys 0m0.843s
1.5 秒,所以快了四倍。
您可能會通過pyvips獲得小幅加速:
#!/usr/bin/python3
import sys
import pyvips
import numpy as np
# map vips formats to np dtypes
format_to_dtype = {
'uchar': np.uint8,
'char': np.int8,
'ushort': np.uint16,
'short': np.int16,
'uint': np.uint32,
'int': np.int32,
'float': np.float32,
'double': np.float64,
'complex': np.complex64,
'dpcomplex': np.complex128,
}
# vips image to numpy array
def vips2numpy(vi):
return np.ndarray(buffer=vi.write_to_memory(),
dtype=format_to_dtype[vi.format],
shape=[vi.height, vi.width, vi.bands])
video_array = []
for filename in sys.argv[1:]:
vi = pyvips.Image.new_from_file(filename, access='sequential')
video_array.append(vips2numpy(vi))
video_array = np.array(video_array)
print(video_array.shape)
我懂了:
$ time ./readframes.py sample/*.tif
(100, 2048, 1450, 3)
real 0m1.360s
user 0m1.629s
sys 0m2.153s
還有10%左右。
最后,正如其他海報所說,您可以并行加載幀。這不會對 TIFF 有多大幫助,但它肯定會提升 PNG。
添加回答
舉報