gpt4 book ai didi

python - OpenCV Python : fast solution for 3-channel float32 image reading?

转载 作者:太空宇宙 更新时间:2023-11-03 12:36:55 27 4
gpt4 key购买 nike

我需要 float32 类型的 3 channel RBG 排序彩色图像,每个颜色 channel 的值在 [0.0, 1.0] 区间内。

这是我目前的解决方案:

def read_images(imagelist):
buffer = list()
for f in imagelist:
# load single image, convert to float32
img = cv2.imread(f).astype(np.float32)
# change interval from [0, 255] to [0.0, 1.0]
img /= 255.0
# leave out alpha channel, if any
if img.shape[2] == 4:
img = img[:, :, 0:3]
buffer.append(img)
return np.array(buffer)

之后,在图像处理程序中,我将 BGR 更改为 RGB 顺序(因为 cv2imread 默认以 BGR 顺序读取图像)。

这个过程对于大型图像集来说非常耗时:我正在加载数千张图像进行预处理,然后将图像提供给一些在 TensorFlow 中实现的神经网络。

有没有办法提高这种方法的性能?

最佳答案

使用这种方法,您可能无法做太多事情来加快图像读取速度。我想也许 Matplotlib 会更快,因为它直接读取为 float 和 RGB 顺序,但它的速度是 OpenCV 的三倍,即使在转换类型和 channel 顺序之后也是如此。 PIL 比 Matplotlib 快一点,但仍然是 OpenCV 的两倍,所以这无济于事,而 scikit-image 的速度与 PIL 大致相同:

import matplotlib.image as mpimg
import cv2
import numpy as np
from skimage import io
from PIL import Image

import timeit
times = range(1000)

# matplotlib
start_time = timeit.default_timer()
for t in times:
img = mpimg.imread('img1.png')
print("mpimg.imread(): ", timeit.default_timer() - start_time, "s")

# OpenCV
start_time = timeit.default_timer()
for t in times:
img = cv2.cvtColor(
cv2.imread('img1.png'), cv2.COLOR_BGR2RGB).astype(np.float32)/255.0
print("cv2.imread(): ", timeit.default_timer() - start_time, "s")

# scikit-image
start_time = timeit.default_timer()
for t in times:
img = io.imread('img1.png').astype(np.float32)/255.0
print("io.imread(): ", timeit.default_timer() - start_time, "s")

# PIL
start_time = timeit.default_timer()
for t in times:
img = np.asarray(Image.open('img1.png')).astype(np.float32)/255.0
print("Image.open(): ", timeit.default_timer() - start_time, "s")

mpimg.imread(): 37.68960806101677 s
cv2.imread(): 13.830177563999314 s
io.imread(): 29.395271296001738 s
Image.open(): 26.633562815986807 s

相反,通过读取所有图像并将它们保存为更好的读取格式(即直接从字节读取)而不是使用图像读取器来进行预处理可能会更好。您可以将图像序列化(pickle)为 .p.pickle 文件,然后将数据直接加载到列表中。这样你只需要一次又一次地进行缓慢加载。作为Dan Mašek在下面的评论中注意,pickling 文件意味着将它们解压缩为原始数据,因此文件大小大得多。您可以使用正确的类型和 channel 顺序创建与现在相同的列表(您的缓冲区),然后 pickle 列表;当需要训练时,您可以加载 pickle 文件;它方式更快,而且 super 简单:

with open(training_file, mode='rb') as f:
training_data = pickle.load(f)

关于python - OpenCV Python : fast solution for 3-channel float32 image reading?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45890171/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com