用零替换numpy数组中低于阈值#的数字

8

我有一个非常大的Numpy数组(2560x1920)。它实际上是来自灰度图片,其中每个像素都被赋予一个0-1之间的数字,表示其亮度。

我想将所有低于某个阈值(比如说0.5)的值替换为零。这可能是一个简单的任务,但我是一个Numpy初学者,我已经搜索过了,仍然无法解决它。

这是我的尝试,我知道它是错误的...

for x in np.nditer(Image):
    if x < .5:
        x == 0

plt.imshow(Image, cmap=plt.cm.gray)
plt.show()

它只是输出正常的图像,而不改变任何内容。

此外,该数组的外观类似于以下内容(显然是缩写):

[[ 0.24565263  0.24565263  0.24902149 ...,  0.27528678  0.27265316
   0.27606536]
 [ 0.24565263  0.24565263  0.24902149 ...,  0.27870309  0.27606536
   0.27948296]
 [ 0.24228902  0.24228902  0.24565263 ...,  0.28212482  0.27948296
   0.282906  ]
 ..., 
 [ 0.29706944  0.29706944  0.29706944 ...,  0.17470162  0.17144636
   0.17144636]
 [ 0.29362457  0.29362457  0.29362457 ...,  0.17144636  0.16495056
   0.16170998]
 [ 0.2901852   0.2901852   0.2901852  ...,  0.16819602  0.16170998
   0.15847427]]
2个回答

17

可以使用numpy的内置索引来替换元素。这可以通过以下方式完成:

Image[Image<0.5] = 0

0

我从未来带来了建议。

以上方法对于简单的全局阈值处理非常有效。我发表这篇答案是为了警告,非自适应阈值处理可能过于天真,具体取决于您的应用程序。

如果没有适应图像的平均亮度或其他特性,如果您正在分析在不同条件下拍摄的多张图片,则输出将不一致。

有更准确的方法,但它们稍微复杂一些。Scikit-Image使此变得容易。

最流行的方法之一是Otsu's(我无法说哪种方法对于每种情况最准确,因为我还没有进行足够的研究)。 https://en.wikipedia.org/wiki/Otsu%27s_method

Scikit-Image将此方法和其他几种算法构建到其模块中。

使用此方法,上面问题的答案就像这样简单:

import matplotlib.pyplot as plt
from skimage.filters import threshold_otsu

thresh = threshold_otsu(Image)
binary = Image > thresh

plt.imshow(Image, cmap=plt.cm.gray)
plt.show()

在这里阅读一个例子: http://scikit-image.org/docs/dev/auto_examples/plot_otsu.html

关于用法,请参考这里: http://scikit-image.org/docs/dev/api/skimage.filters.html?highlight=local%20otsu


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接