我想使用np.isclose()来比较图像的像素数组。下面是我想做的事:
print(image_array.shape) # (320, 240, 4)
for i in range(0, len(image_array)):
for j in range(0, len(image_array[i])):
if np.isclose(image_array[i][j], [1, 0, 0, 1]):
image_array[i][j] = [0, 1, 0, 1]但是我得到了下面的错误ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()。
我不能使用np.all(),因为我想替换所有甚至足够接近的像素。
发布于 2021-08-23 16:11:03
与其使用np.isclose,不如使用np.allclose。这将为该比较返回一个布尔值。
发布于 2021-08-23 16:10:01
在文档中- isclose“返回一个布尔数组,其中两个数组在公差范围内元素上是相等的。
因此,返回的布尔值数组表示4元素数组的每个值的近似值。这取决于您如何将该数组转换为单个布尔值。
例如,您可能只关心这4种匹配中的任何一种,在这种情况下,您可以使用any();或者,如果您关心是否所有匹配,则可以使用all()。
发布于 2021-08-23 17:31:47
image_array[i,j]是一个形状(4,)数组(您可以检查它)。isclose和[1,0,0,1]是一个相同大小的布尔数组。它不能在if中使用。但是您可以将all应用于此,也可以使用allclose来测试“像素”是否匹配。
但是,如果没有双循环,您可以进行如下测试:
In [381]: arr = np.random.randint(0,2,(3,6,4))
In [382]: arr.shape
Out[382]: (3, 6, 4)
In [383]: np.isclose(arr,np.array([1,0,0,1]))
Out[383]:
array([[[ True, True, False, False],
[False, False, True, True],
[ True, True, True, False],
[False, False, True, False],
[ True, False, False, True],
[ True, False, False, False]],
[[False, True, False, False],
[ True, True, True, False],
[ True, False, False, True],
[False, False, True, True],
[False, True, True, False],
[False, False, True, True]],
[[False, False, False, True],
[ True, True, True, True],
[ True, True, False, False],
[ True, False, True, True],
[False, False, False, False],
[False, False, False, True]]])(由于我使用的是randint arr,所以是int dtype,而==应该和isclose一样好。但下面的情况是一样的。
在最后一个维度上应用all:
In [384]: np.isclose(arr,np.array([1,0,0,1])).all(axis=-1)
Out[384]:
array([[False, False, False, False, False, False],
[False, False, False, False, False, False],
[False, True, False, False, False, False]])这里有一个“像素”匹配,我们可以识别:
In [385]: I,J = np.nonzero(_)
In [386]: I,J
Out[386]: (array([2]), array([1]))
In [387]: arr[2,1]
Out[387]: array([1, 0, 0, 1])或者为这两个数组建立索引:
In [389]: arr[I,J]
Out[389]: array([[1, 0, 0, 1]])这是一个(n,4)数组,其中n是匹配的数目(可能是0)。我们可以用它来修改arr:
In [390]: arr[I,J]=[1,0,1,0]现在没有匹配了:
In [391]: np.isclose(arr,np.array([1,0,0,1])).all(axis=-1)
Out[391]:
array([[False, False, False, False, False, False],
[False, False, False, False, False, False],
[False, False, False, False, False, False]])但是,现在有3个匹配的新值:
In [392]: np.isclose(arr,np.array([1,0,1,0])).all(axis=-1)
Out[392]:
array([[ True, False, False, False, False, False],
[False, False, False, False, False, False],
[False, True, True, False, False, False]])
In [393]: arr[_] # index with the boolean mask
Out[393]:
array([[1, 0, 1, 0],
[1, 0, 1, 0],
[1, 0, 1, 0]])https://stackoverflow.com/questions/68895789
复制相似问题