用nery数组替换低于阈值#的数字

时间:2015-10-29 22:07:06

标签: python python-3.x numpy

所以我有一个非常大的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 个答案:

答案 0 :(得分:7)

有numpy的内置索引,可用于替换元素。这可以这样做:

Sub validationCombination1()
    Columns("A:A").Select
    formatDate

    Columns("B:B").Select
    formatInteger
End Sub

Sub validationCombination2()
    Columns("A:A").Select
    formatDate
    conditionalFormat_Duplicates

    Columns("B:B").Select
    formatInteger
    dataValidation_IntegersWithRange
End Sub

答案 1 :(得分:0)

我已经从未来回来提出建议。

上述方法适用于简单的全局阈值。 我发布这个答案警告说,根据你的申请,非适应性阈值处理可能太天真了。

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

有更准确的方法,但它们有点复杂。 Scikit-Image使这很容易。

最受欢迎的方法之一是Otsu(我不能说哪种情况对每种情况最准确,我还没有充分研究过)。 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