将numpy数组中低于阈值的数字替换为零

2024-04-23 09:16:55 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我试图用零替换所有低于阈值(比如0.5)的值。 这可能是一个简单的任务,但我是一个新手与纽比,我搜索了周围,仍然没有找到它。在

这是我所尝试的,我知道这是错误的。。。在

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

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

它只输出正常图像而不改变任何东西。在

数组也类似于这样(明显缩写):

^{pr2}$

Tags: inimagenumpyfor错误图片plt阈值
2条回答

有numpy的内置索引,可以用来替换元素。这可以通过以下方式实现:

Image[Image<0.5] = 0

我带着建议从未来回来。在

上述方法对于一个简单的全局阈值非常有效。 我发布这个答案是为了警告非自适应阈值,像这样,可能太天真了,这取决于您的应用程序。在

如果不适应图像的平均亮度或其他质量,如果要分析在不同条件下拍摄的多张照片,输出将不一致。在

有更精确的方法来解决这个问题,但它们稍微复杂一点。Scikit图像使这一切变得简单。在

最流行的方法之一是大津的(我不能说哪种方法对每种情况都是最准确的,我还没有进行足够的研究)。 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

相关问题 更多 >