微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决Numpy - 如何从 4 个输入图像构建新图像,选择最亮的像素max(R+G+B)

有四个像这样的图像数组:

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

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

image3 = np.array([
    [
        [9,[22,25,16]
    ],[
        [10,20,23],[
        [13,23,[222,235,216]
    ],])

image4 = np.array([
    [
        [29,[223,125,[
        [210,220,252,232],[122,[
        [123,232,])

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

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

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,3,3]),array([0,2]),2]))

link 中有类似的答案,但无法解决我的问题。那么如何在第一次匹配时获取索引。

编辑:

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

解决方法

(提出一个不使用 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,[ 56,255,213],[222,235,216]]])
,

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

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

Out[]: 
array([[[[ 91,216]]]])
,

您可以使用 np.choose

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)相同。

,

我认为这就是您要找的:

np.choose(array_sum_max_index[...,tuple(array))

输出:

array([[[ 91,216]]])

说明:

  1. array_sum_max_index 的形状为 (m,n),其中每个图像都是一个形状为 (m,n,3)

    的数组
  2. array 是形状(4,m,3) 的数组,tuple(array) 的每个“元素”都是形状(m,3)

    的子数组
  3. 我们尝试使用 np.choose(),将 array_sum_max_index 作为“选择器”数组传递,将 tuple(array) 作为选择器将从中选择的子数组序列从。但正如您在 numpy.choose() 的文档中看到的那样,“选择器”数组和从中选择的子数组都必须一起广播。由于“选择器”数组 array_sum_max_index 的形状为 (m,n),为了使其可与形状为 (m,3) 的子数组一起广播,我们将单位长度的额外维度附加到 array_sum_max_index,使用表达式 array_sum_max_index[...,None]

  4. 如果我们只使用 array 而不是 tuple(array),这仍然有效,但 numpy.choose() 的文档不鼓励这样做。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?