2012-09-24 63 views
1

我正站在一個巨大的問題面前。使用python庫NumPy和SciPy,我確定了大數組中的幾個特徵。爲此,我創建了一個3x3相鄰結構,並將其用於連接組件分析 - >請參閱docsPython - 通過確定的組件特徵來確定

struct = scipy.ndimage.generate_binary_structure(2,2) 
labeled_array, num_features = ndimage.label(array,struct) 

我現在的問題是,我想遍歷循環中的所有標識的功能。有人有一個想法如何解決NumPy數組中的各個功能?

+1

如果您還沒有準備好,一定要看看scikits圖像(http://scikits-image.org/)。它提供了比scipy.ndimage更多的圖像處理算法。 –

+0

看起來像一個非常有前途的圖書館。如果我的代碼片段的速度和可重用性進一步下降,我會盡力去做。除非你自發地在scikits-image中知道一些很好的功能尋址功能。 – Curlew

回答

3

這裏的處理由ndimage.label識別的特徵的例子。這是否對您有所幫助取決於您想要使用哪些功能。

import numpy as np 
import scipy.ndimage as ndi 
import matplotlib.pyplot as plt 


# Make a small array for the demonstration. 
# The ndimage.label() function treats 0 as the "background". 
a = np.zeros((16, 16), dtype=int) 
a[:6, :8] = 1 
a[9:, :5] = 1 
a[8:, 13:] = 2 
a[5:13, 6:12] = 3 

struct = ndi.generate_binary_structure(2, 2) 
lbl, n = ndi.label(a, struct) 

# Plot the original array. 
plt.figure(figsize=(11, 4)) 
plt.subplot(1, n + 1, 1) 
plt.imshow(a, interpolation='nearest') 
plt.title("Original") 
plt.axis('off') 

# Plot the isolated features found by label(). 
for i in range(1, n + 1): 
    # Make an array of zeros the same shape as `a`. 
    feature = np.zeros_like(a, dtype=int) 

    # Set the elements that are part of feature i to 1. 
    # Feature i consists of elements in `lbl` where the value is i. 
    # This statement uses numpy's "fancy indexing" to set the corresponding 
    # elements of `feature` to 1. 
    feature[lbl == i] = 1 

    # Make an image plot of the feature. 
    plt.subplot(1, n + 1, i + 1) 
    plt.imshow(feature, interpolation='nearest', cmap=plt.cm.copper) 
    plt.title("Feature {:d}".format(i)) 
    plt.axis('off') 

plt.show() 

下面是由腳本生成的圖像:上解決上述問題的另一種方式

enter image description here

+1

非常感謝您提供這個直接的解決方案。我不知道NumPy花哨索引。在確定了各個特徵之後,我希望獲得該特徵直接附近的零單元數。我已經通過調用「sum(array [array> 0])」來提取特徵尺寸「 – Curlew

1

只是快速筆記。也可以使用ndimage「find_objects」函數,而不是使用NumPy「fanzy索引」。 例如:

# Returns a list of slices for the labeled array. The slices represent the position of features in the labeled area 
s = ndi.find_objects(lbl, max_label=0) 
# Then you can simply output the patches 
for i in n: 
    print a[s[i]] 

我將離開開放的問題,因爲我沒能解決的額外產生的問題。我想通過ndi.sum()已經解決了這些問題的大小(非常容易)以及直接在該特徵附近的非標記單元的數量(ergo統計該特徵周圍的零的數量)。