快速合并(x,y)多个图像的像素值的方法?

时间:2018-04-13 10:12:07

标签: arrays python-3.x image performance numpy

我有10个1944 x 2546二进制图像存储在nparray images中。 我想读取10个图像上每个像素的像素值,并将它们组合成0和1的字符串(例如' 1001101100')并将它们存储到2D数组output中。到目前为止,我使用的是嵌套的for循环,这非常慢。因此,我想知道是否有更聪明的方法来实现相同的结果。我目前的代码如下:

output = [()]
for y in range(0,image_height):
    for x in range(0,image_width):
        code_string = ''
        for n in range(0,len(images)-2):
            code_string = code_string + str(images[n][y,x]/255)
        output.append(code_string)

3 个答案:

答案 0 :(得分:4)

您可以执行以下操作:

# create 0, 255 arrays
imgs = [255 * np.random.randint(0, 2, (1944,2546)) for i in range(10)]

# binarize them, convert to int32, stack them along the last axis,
# add the offset of character '0' and view-cast to unicode
binstr = (np.r_[('2,3,0', *map(np.int32, map(np.bool8, imgs)))] + ord('0')).view('U10').squeeze()
binstr
# array([['0010110011', '0101011101', '0001000000', ..., '1011101100',
#         '1110011110', '0011110111'],
#        ['1101110100', '0000001000', '0000100101', ..., '0000110100',
#         '1000010011', '0001101011'],
#        ['0100011100', '0111101001', '0001011001', ..., '1111011111',
#         '0110100000', '0001111000'],
#        ...,
#        ['0100000110', '1000000000', '0000001011', ..., '1001110001',
#         '1001010000', '0010010111'],
#        ['0011100010', '0110010101', '0011111000', ..., '1011100101',
#         '1011001111', '1100011011'],
#        ['0011111101', '0000001101', '1110011011', ..., '1011110100',
#         '0001010010', '0001010010']], dtype='<U10')

我的笔记本电脑上的转换需要半秒钟。

答案 1 :(得分:1)

通过不迭代地创建和附加到字符串,您可能会获得一个小的加速,但只是在收集图像中的位之后只有一次:

    code_string = []
    for n in range(0,len(images)-2):
        code_string.append(images[n][y,x]/255)
    output.append(''.join(code_string))

可能更好的方法是将图像加载到numpy-arrays中并正确切片和切片 - 我的numpyfu不够好。

答案 2 :(得分:0)

我认为最慢的部分是调用10 x 1944 x 2546追加命令。

您可以将图像重塑为形状(1944x2546,10)表格,如果您想要列表,请在结尾处使用X.tolist()命令。

images_bool = images < 256
output = images_bool.transpose((1,2,0)).reshape((1944*2546,10)).tolist()

为什么转换为字符串?