如何解决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]]])
说明:
-
的数组array_sum_max_index
的形状为(m,n)
,其中每个图像都是一个形状为(m,n,3)
-
的子数组array
是形状(4,m,3)
的数组,tuple(array)
的每个“元素”都是形状(m,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]
-
如果我们只使用
array
而不是tuple(array)
,这仍然有效,但numpy.choose()
的文档不鼓励这样做。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。