2015-10-29 91 views
2

所以我有一個非常大的Numpy數組(2560x1920)。它實際上來自一張灰度圖片,每個像素都有一個0-1的數字來表示它的亮度。將數字在numpy數組下面的閾值#替換爲零

我試圖用0替換閾值以下的所有值,比如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]] 

回答

5

有numpy的的可用於替換元件內置索引。這可以這樣做:

Image[Image<0.5] = 0 
0

我已經從未來的建議返回。

上述方法適用於簡單的全局閾值。 我發佈這個答案來警告,像這樣的非自適應閾值,可能會太天真,取決於您的應用程序。

如果您正在分析在不同條件下拍攝的多張照片,如果不適應圖像的平均亮度或其他品質,您的輸出將不一致。

有很多更準確的方法,但它們稍微複雜一點。 Scikit-Image使這一切變得簡單。大津的一個最流行的方法是(我不能說哪個是最準確的每種情況,我沒有足夠的研究)。 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