numpy 将图像读入元组数组的最快方法是什么?

bq3bfh9z  于 2022-11-10  发布在  其他
关注(0)|答案(2)|浏览(145)

我正在尝试将省份分配到一个区域,以便在游戏模式中使用。我有两张不同的地区和省份Map。provinces filearea file。目前,我正在使用PIL读入一个Python格式的图像并将其存储在一个数组中,如下所示:

import PIL

land_prov_pic = Image.open(INPUT_FILES_DIR + land_prov_str)
land_prov_array = np.array(land_prov_pic)
image_size = land_prov_pic.size
for x in range(image_size[0]):
    if x % 100 == 0:
        print(x)
    for y in range(image_size[1]):

        land_prov_array[x][y] = land_prov_pic.getpixel((x,y))

其中最终得到land_prov_array[x][y]=(R,G,B)
然而,这个Get非常慢,特别是对于大图像。我尝试使用OpenCV阅读它,如下所示:

import opencv
land_prov_array = cv2.imread(INPUT_FILES_DIR + land_prov_str)
land_prov_array = cv2.cvtColor(land_prov_array, cv2.COLOR_BGR2RGB) #Convert from BGR to RGB

但现在land_prov_array[x][y] = [R G B]ndarray,不能插入到集合中。但它比前一个for循环快得多。如何在没有for循环的情况下为数组中的每个元素将[R G B]转换为(R,G,B),或者更好的是,以这种方式读取它?
编辑:添加图片、更多说明和代码块以提高可读性。

xeufq47z

xeufq47z1#

当您需要将[R,G,B]数组转换为元组时,最好将其转换为元组,而不是将整个图像转换为这种形式。与数值型数组相比,元组数组占用的内存要多得多,处理起来也要慢得多。
answer by isCzech展示了如何在3D数组上创建NumPy视图,该数组将数据呈现为元组的2D数组。这可能不需要实际元组数组的额外内存,但处理起来仍然要慢得多。
最重要的是,大多数NumPy函数(如np.mean)和运算符(如+)不能应用于这样的数组。因此,必须在Python代码中(或使用@np.vectorize函数)迭代数组,这比使用NumPy函数和运算符作为一个整体处理数组的效率要低得多。

vlurs2pr

vlurs2pr2#

对于从3D数组(data3D)到2D数组(data2D)的转换,我使用了以下方法:

import numpy as np

dt = np.dtype([('x', 'u1'), ('y', 'u1'), ('z', 'u1')])

data2D = data3D.view(dtype=dt).squeeze()

.view修改数据类型,并返回大小为1的最后一维的3D数组,然后.squeeze可以删除该数组。或者,您可以使用.squeeze(axis=-1)仅挤压最后一个维度(以防其他维度也是1)。
请注意,我使用的是uint8('u1')-您的类型可能不同。
尝试使用循环来实现这一点确实非常慢(至少与这种方法相比是如此)。
这里有类似的问题:以图像的形式显示一个二维Numy数组,其中的内容是元组

相关问题