2013-08-20 46 views
1
def distancesplit(self): 
    img = np.asarray(Image.open("testtwo.tif").convert('L'))        
    img = 1 * (img < 127) 

    areasplit = np.split(img.ravel(), 24) # here we are splitting converted to 1D array 
    for i in areasplit: 
     area = (i == 0).sum() 
    print area 

如何在面积最小,平均和最大面积值的区域中选择子阵列?如何在具有最小,平均和最大面积值的numpy一维数组中选择子阵列?

+0

你可以更清楚地了解 –

+0

可能重复的[如何选择NumPy子数组与平均数量的白色像素?](http://stackoverflow.com/questions/18354344/how-to-select-numpy-subarray-with-average-number-of-white -pixels) – tom10

回答

2

马克斯:你认为可能有以下几种阵列符合您的标准:

areasplit[argmax(sum(areasplit==0, axis=0)), :] 

argmin用于替换分钟argmax

例:“最小,平均和最大面积值”

>>> from numpy import * 
>>> a=array(range(81)) 
>>> b=split(a, 9) 
>>> b#be careful it is a list of arrays not just an array 
[array([0, 1, 2, 3, 4, 5, 6, 7, 8]), array([ 9, 10, 11, 12, 13, 14, 15, 16, 17]), \ 
array([18, 19, 20, 21, 22, 23, 24, 25, 26]), array([27, 28, 29, 30, 31, 32, 33, 34, 35]), \ 
array([36, 37, 38, 39, 40, 41, 42, 43, 44]), array([45, 46, 47, 48, 49, 50, 51, 52, 53]), \ 
array([54, 55, 56, 57, 58, 59, 60, 61, 62]), array([63, 64, 65, 66, 67, 68, 69, 70, 71]), \ 
array([72, 73, 74, 75, 76, 77, 78, 79, 80])] 
>>> b=array(split(a, 9)) #I prefer to use b.reshape((-1,9)) over split()., which returns an array. 
>>> b#now it is an array 
array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8], 
     [ 9, 10, 11, 12, 13, 14, 15, 16, 17], 
     [18, 19, 20, 21, 22, 23, 24, 25, 26], 
     [27, 28, 29, 30, 31, 32, 33, 34, 35], 
     [36, 37, 38, 39, 40, 41, 42, 43, 44], 
     [45, 46, 47, 48, 49, 50, 51, 52, 53], 
     [54, 55, 56, 57, 58, 59, 60, 61, 62], 
     [63, 64, 65, 66, 67, 68, 69, 70, 71], 
     [72, 73, 74, 75, 76, 77, 78, 79, 80]]) 
>>> b[argmax(sum(b, axis=1)), :] 
array([72, 73, 74, 75, 76, 77, 78, 79, 80]) 
>>> b[argmin(sum(b, axis=1)), :] 
array([0, 1, 2, 3, 4, 5, 6, 7, 8]) 
>>> b[argwhere(median(b)==median(b, axis=1)).flatten(),:] #be careful there may be several matching sub-arrays 
array([[36, 37, 38, 39, 40, 41, 42, 43, 44]]) 
>>> b[argwhere(mean(b)==mean(b, axis=1)).flatten(),:] 
array([[36, 37, 38, 39, 40, 41, 42, 43, 44]]) 
+0

+1击败我吧......他可能希望使用'np.argsort'来获得区域的排序,特别是如果他也想要中位图像的话。 – Jaime

+0

@Jaime:同意!中值比平均值更好/更安全,其平均值等于大平均值的子数组可能并可能不存在。干杯! –

+0

@KvasDub:使用'argwhere'作为平均数或中位数,但Jaime的建议是一个更好的建议。 –

相关问题