【问题标题】:passing an array as an index to another array?将数组作为索引传递给另一个数组?
【发布时间】:2017-12-09 10:50:49
【问题描述】:

好的,所以我正在编写一些用于图像处理的代码,其中大部分是从一些旧的 matlab 代码转换而来的,用于相同的过程。在我现在(过程中的最后一步)这一点上,我需要将一个数组作为索引传递给另一个数组。

一点背景:我将图像分成 RGB 波段或蒙版。在代码的前面,我拍摄了所有图像(作为 numpy 数组)并沿第三维取中值。我正在尝试将 RGB 掩码作为参数传递,这样我就可以获得这些像素值的中位数,并用 0 代替 RB 像素。

在 Matlab 中执行此操作的代码非常简单:

finalMedGreen_ROI(exp_i+1) = median(median(EXPMedian_ROI(GMask_ROI)));

其中 GMask_ROI 是一个数组,它是原始图像数据的感兴趣区域,EXPMedian_ROI 是所有原始图像数据的中位数。

我试图在 python 中复制它:

self.final_median_green_roi[image+1] = np.median(np.median(self.exposure_median_roi(self.green_mask_roi)))

我得到了这个错误:

TypeError: 'numpy.ndarray' object is not callable

我试图简单地将两个数组作为参数传递给 np.median。事情是这样的,self.green_mask_roi 是一个布尔值数组(绿色像素为真,其他一切为假。当我运行这个时:

self.final_median_green_roi[0,1] = np.median(np.median(self.dark_median_roi,self.green_mask_roi))

我收到了这个错误:

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

我不确定它是否建议布尔数组或数字中位数数组,我宁愿把它做​​对,因为我是图像处理的新手,我不太可能发现错误.有什么建议吗?

【问题讨论】:

  • 请说明您想通过放置 dark_median_roi 和 green_mask_roi 来实现什么。你不能做他们在示例中所做的事情,因为它们都是数组。在示例中,EXPMedianROI 是在 GMask_ROI 上调用的方法
  • 数组是原始图像数据(以 RGGB 值表示的图像)。我正在尝试做的是收集每个绿色像素的中值。然后将中位数传递给更多次以将其压缩为奇异值。
  • 那么你想求两个数组组合的中位数吗? (联合还是交叉点?)
  • 就像我说的那样,其中一个数组充满了布尔值,所以我想更好的表达方式是我想关闭第一个数组中第二个数组中为假的每个值.
  • callable 错误意味着您在数组上使用arr(idx) 语法,而不是正确的索引语法arr[idx]。请记住,numpy 中的索引语法不同。你们中的任何一个都在应该使用函数的地方使用数组。

标签: python arrays matlab numpy image-processing


【解决方案1】:

使用 numpy 的内置掩码数组:

...  =np.median(np.median(np.ma.masked_array(self.dark_median_roi‌​, self.green_mask_roi)))

这会通过制作第二个参数 self.green_mask_roi 的掩码并将其应用于第一个参数 self.dark_median_roi 来创建一个新数组,这样您就可以得到一个包含 self.dark_median_roi 的所有原始元素的数组也存在于 self.green_mask_roi 中。

【讨论】:

  • 我第一次运行它时说它对 int 和生成器表达式的操作无效。所以我把它放在一个 np.array 语句中,但它周围有一些括号,我又得到了这个错误:ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
  • 试试这个:=np.median(np.median(np.ma.masked_array(self.dark_median_roi, self.green_mask_roi)))
  • 另外,这两个数组的维度是多少?我一直假设它们是一维的
  • 很高兴听到!我将编辑答案,如果您可以将其标记为已接受的答案,那就太好了。
  • 它们的形状都是 (200,200)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-09
  • 1970-01-01
  • 2017-11-15
  • 1970-01-01
  • 2015-09-28
  • 1970-01-01
相关资源
最近更新 更多