Numpy如何从4个输入图像中创建新图像,选择最亮的像素(最大(R+G+B))

2024-10-08 21:22:32 发布

您现在位置:Python中文网/ 问答频道 /正文

有以下四种图像阵列:

image1 = np.array([
    [
      # [R  G  B]
      #  |  |  |
        [1, 2, 3], [11, 22, 55], [12, 45, 56]
    ],
    [
        [1, 2, 3], [56, 55, 13], [12, 45, 56]
    ],
    [
        [11, 22, 55], [56, 55, 13], [12, 45, 56]
    ],
])

image2 = np.array([
    [
        [91, 72, 33], [111, 222, 155], [212, 245, 156]
    ],
    [
        [100, 200, 113], [56, 255, 213], [112, 145, 156]
    ],
    [
        [113, 223, 255], [156, 55, 113], [212, 245, 156]
    ],
])

image3 = np.array([
    [
        [9, 2, 3], [111, 222, 255], [22, 25, 16]
    ],
    [
        [10, 20, 13], [156, 25, 23], [12, 45, 16]
    ],
    [
        [13, 23, 155], [56, 255, 13], [222, 235, 216]
    ],
])

image4 = np.array([
    [
        [29, 22, 23], [111, 222, 255], [223, 125, 216]
    ],
    [
        [210, 220, 13], [156, 252, 232], [122, 145, 216]
    ],
    [
        [123, 232, 155], [56, 255, 213], [222, 235, 216]
    ],
])

对于每一行和每一列,我想计算图像数组的Red & Green & Blue通道之和的maxRGB值,并使用max来构建一个新的图像数组

因此,在尝试了以下代码之后,它得到了重复的索引,因为在每行和每列中,三个图像数组的maxRGB可能是重复的。但我只想得到第一个匹配索引

array = np.array([image1, image2, image3, image4])
array_sum = array.sum(axis=3)
# array_sum_max_index = array_sum.argmax(axis=0)
indices = np.where(array_sum == array_sum.max(axis=0))
print(indices)

输出

(array([1, 1, 1, 2, 2, 3, 3, 3, 3, 3, 3]), array([0, 0, 2, 0, 2, 0, 1, 1, 1, 2, 2]), array([0, 2, 0, 1, 2, 1, 0, 1, 2, 1, 2]))

在这个{a1}中有一个类似的答案,但它不能解决我的问题。因此,如何在索引首次匹配时获取索引

编辑:

输入图像的实际数量超过32。(因此,涉及numpy.choose()的解决方案可能不起作用)


Tags: 图像npgreenred数组arraymaxsum
3条回答

(提出不使用numpy.choose()的替代解决方案,因为OP指出32选择数组在numpy.choose()情况下的约束是一个问题)

array = np.array([image1, image2, image3, image4])
array_sum = array.sum(axis=3)
array_sum_max_index = array_sum.argmax(axis=0)

m = 3 # Number of pixel rows
n = 3 # Number of pixel columns

array[array_sum_max_index, np.arange(m)[:,None,], np.arange(n)[None,:]]

输出:

array([[[ 91,  72,  33],
        [111, 222, 255],
        [212, 245, 156]],

       [[210, 220,  13],
        [156, 252, 232],
        [122, 145, 216]],

       [[113, 223, 255],
        [ 56, 255, 213],
        [222, 235, 216]]])

您可以使用^{}执行此操作:

np.choose(array_sum_max_index, array_sum)

它在每个位置为您提供最亮(最高R+G+B)的像素:

array([[196, 588, 613],
       [443, 640, 483],
       [591, 524, 673]])

结果与array_sum.max(axis=0)相同

在一行中(基于@fountainhead的回答):

np.take_along_axis(array, array.sum(3).argmax(0)[None, ..., None], 0)

Out[]: 
array([[[[ 91,  72,  33],
         [111, 222, 255],
         [212, 245, 156]],

        [[210, 220,  13],
         [156, 252, 232],
         [122, 145, 216]],

        [[113, 223, 255],
         [ 56, 255, 213],
         [222, 235, 216]]]])

相关问题 更多 >

    热门问题