gpt4 book ai didi

python - 使用 Python/NumPy 对图像阈值进行矢量化

转载 作者:行者123 更新时间:2023-11-28 21:09:30 26 4
gpt4 key购买 nike

我一直在努力寻找一种更有效的方法来遍历图像并在阈值上拆分它们的属性。在网上搜索并与一些编程 friend 讨论时,他们向我介绍了矢量化(特别是使用 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 语句搜索每个像素。

最佳答案

NumPy 通过其 arrays 支持并鼓励矢量化和 ufuncs .在你的例子中,你有一个 NumPy 数组作为输入图像。因此,这些比较可以以一次性/矢量化的方式完成,从而为我们提供与输入数组形状相同的 bool 数组。那些用于索引输入数组的 bool 数组将从中选择有效元素。这叫做 boolean-indexing并在这种矢量化选择中形成关键特征。

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

因此,为了将所有这些放入代码中,我们将有 -

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

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

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

关于python - 使用 Python/NumPy 对图像阈值进行矢量化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38272339/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com