【问题标题】:Vectorizing image thresholding with Python/NumPy使用 Python/NumPy 向量化图像阈值
【发布时间】:2016-07-08 17:25:14
【问题描述】:

我一直在尝试找到一种更有效的方法来遍历图像并在阈值上分割它们的属性。在网上搜索并与一些编程朋友讨论时,他们向我介绍了向量化(特别是使用 numpy)函数的概念。经过多次搜索和反复试验,我似乎无法掌握它。有人可以给我一个链接,或建议如何使以下代码更有效率吗?

Im = plt.imread(img)
Imarray = np.array(Im)
for line in Imarray:
    for pixel in line:
        if pixel <= 20000:
            dim_sum += pixel
            dim_counter += 1
        if pixel > 20000:
            bright_sum += pixel
            bright_counter += 1
bright_mean = bright_sum/bright_counter
dim_mean = dim_sum/dim_counter

基本上,每个像素的亮度值都在 0 到 30000 之间,我试图分别平均低于 20000 和高于 20000 的所有像素。我知道如何做到这一点的最好方法是使用 for 循环(在 python 中很慢)并使用 if 语句搜索每个像素。

【问题讨论】:

  • 你的缩进不正确
  • 感谢 marko,我在发布后注意到了这一点。我刚刚在 C++ 中输入了一个代码,却忘了仔细检查。

标签: python arrays numpy image-processing vectorization


【解决方案1】:

NumPy 通过其arraysufuncs 支持并鼓励向量化。在您的情况下,您有一个 NumPy 数组作为输入图像。因此,这些比较可以一次性/矢量化方式完成,从而为我们提供与输入数组形状相同的布尔数组。这些布尔数组在用于索引输入数组时会从中选择有效元素。这称为boolean-indexing,是此类矢量化选择的关键特征。

最后,我们使用 NumPy ufunc ndarray.mean 再次以矢量化方式运行,为我们提供所选元素的平均值。

因此,要将所有这些都放入代码中,我们需要 -

bright_mean, dim_mean = Im[Im > 20000].mean(), Im[Im <= 20000].mean()

对于这个特定的问题,从代码效率的角度来看,执行一次比较会更有意义。比较会给我们一个布尔数组,以后可以使用两次,一次是原样,第二次是倒置的。因此,或者我们会 -

mask = Im > 20000
bright_mean, dim_mean = Im[mask].mean(), Im[~mask].mean()

【讨论】:

  • 感谢 Divakar,我很好奇布尔数组是如何正常工作的。这很有意义。
猜你喜欢
  • 2022-10-05
  • 2020-11-22
  • 1970-01-01
  • 2017-12-27
  • 2016-11-15
  • 2017-12-28
  • 2014-09-01
  • 2020-03-23
  • 1970-01-01
相关资源
最近更新 更多