我一直在试图找到一种更有效的方法来迭代图像并在阈值上分割它们的属性。在网上搜索和与一些编程朋友讨论时,他们向我介绍了矢量化(特别是使用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数组作为输入图像。因此,这些比较可以一次进行/矢量化,从而得到与输入数组形状相同的布尔数组。那些用于索引到输入数组的布尔数组将从中选择有效元素。这称为boolean-indexing
并在这种矢量化选择中形成一个关键特征。
最后,我们使用NumPy ufuncndarray.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()
关于python - 使用Python/NumPy对图像阈值进行矢量化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38272339/