第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

從文件夾中的圖像序列中獲取一個 numpy 數(shù)組

從文件夾中的圖像序列中獲取一個 numpy 數(shù)組

白板的微信 2021-09-11 13:23:08
我有一個文件夾,video1按順序說一堆圖像frame_00.png, frame_01.png, ...我想要的是格式的 4D numpy 數(shù)組 (number of frames, w, h, 3)這就是我所做的,但我認為它很慢,有沒有更快或更有效的方法來實現(xiàn)同樣的目標?folder = "video1/"import osimages = sorted(os.listdir(folder)) #["frame_00", "frame_01", "frame_02", ...]from PIL import Image import numpy as np video_array = []for image in images:    im = Image.open(folder + image)    video_array.append(np.asarray(im)) #.transpose(1, 0, 2))video_array = np.array(video_array)print(video_array.shape)#(75, 50, 100, 3)
查看完整描述

2 回答

?
Smart貓小萌

TA貢獻1911條經(jīng)驗 獲得超7個贊

我將簡要介紹該線程的主要要點:

  • 最快的常用圖像讀取功能imread來自cv2包。

  • 讀取圖像然后將它們添加到一個普通的 Python 列表中(正如您已經(jīng)在做的那樣)是讀取大量圖像的最快方法。

  • 然而,鑒于您最終將圖像列表轉(zhuǎn)換為圖像數(shù)組,構(gòu)建圖像數(shù)組的每種可能方法幾乎與任何其他方法一樣快

    • 盡管有趣的是,如果您采用直接將圖像分配給預分配數(shù)組的方法,實際上分配給哪個索引(即哪個維度)對于獲得最佳性能很重要。

所以基本上,在純單線程 Python 中工作時,您將無法獲得更快的速度。您可能會從切換到cv2.imread(代替PIL.Image.open)獲得提升。


查看完整回答
反對 回復 2021-09-11
?
慕神8447489

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。


查看完整回答
反對 回復 2021-09-11
  • 2 回答
  • 0 關注
  • 208 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號