从numpy数组中删除连续数字

时间:2018-06-07 14:26:43

标签: python arrays numpy

我是python的新手,但我真的很困惑我正在努力做的这个项目。我有一张显示here的图片。我要做的是找到图像中所有正方形的平均值,其中像素范围是0到255.下面的代码显示了我用来计算图片值的方法。出现的问题是像素/方块的大小不同,有些大于另一个。例如,在查看初始图片here的一部分的一个实例中,正方形都是相等的,因此数组都是相等的。但是在this图片中,我们可以看到右侧的正方形小于左侧的正方形。

我正在考虑从原始数组创建一个子数组,其中忽略任何重复的值。例如,如下所示:

1 1 1 2 2 1 2
1 1 1 2 2 1 2
1 1 1 2 2 1 2
1 1 1 2 2 1 2
3 3 3 4 4 1 2
3 3 3 4 4 1 2
5 5 5 6 6 1 2
7 7 7 8 8 1 2
7 7 7 8 8 1 2

to 

1 2 1 2
3 4 1 2
5 6 1 2
7 8 1 2

我尝试使用以下内容:

1. unique_rows = np.unique(data, axis=0)
2. unique_columns = np.unique(unique_rows, axis=1)

将所有不重复的行显示为原始的新数组,然后使用第二个代码从新数组中获取所有非重复的列。不幸的是,这样做是为了摆脱所有重复的价值观。我想要的只是摆脱重复的连续值。

我真的很困惑该怎么办请帮忙!

代码:

from PIL import Image
import numpy as np

img = Image.open('greyscale.png').convert('L')  # convert image to 8-bit grayscale
WIDTH, HEIGHT = img.size

data = list(img.getdata()) # convert image data to a list of integers
# convert that to 2D list (list of lists of integers)
data = np.array ([data[offset:offset+WIDTH] for offset in range(0, WIDTH*HEIGHT, WIDTH)])

#unique_rows = np.unique(data, axis=0)
#unique_columns = np.unique(unique_rows, axis=1)

# At this point the image's pixels are all in memory and can be accessed
# individually using data[row][col].

# For example:
#print data
for row in data:
    print(' '.join('{:3}'.format(value) for value in row))

print np.mean(data)

2 个答案:

答案 0 :(得分:1)

我检查了这个解决方案是否适用于整个图像,而不是那个小样本,它确实有用 我将举一个小数组的例子:

import numpy as np

x = np.array([[1, 1, 1, 2, 2, 1, 2],
              [1, 1, 1, 2, 2, 1, 2],
              [1, 1, 1, 2, 2, 1, 2],
              [1, 1, 1, 2, 2, 1, 2],
              [3, 3, 3, 4, 4, 1, 2],
              [3, 3, 3, 4, 4, 1, 2],
              [5, 5, 5, 6, 6, 1, 2],
              [7, 7, 7, 8, 8, 1, 2],
              [7, 7, 7, 8, 8, 1, 2]])

rows_mask = np.insert(np.diff(x[:, 0]).astype(np.bool), 0, True)
columns_mask = np.insert(np.diff(x[0]).astype(np.bool), 0, True)

print(x[np.ix_(rows_mask, columns_mask)])

给出:

[[1 2 1 2]
 [3 4 1 2]
 [5 6 1 2]
 [7 8 1 2]]

从这里你可以计算平均值。

关于获取rows_maskcolumns_mask,您可以在此处阅读:Remove following duplicates in a numpy array 另请注意,如果没有np.ix_,则只返回对角元素:Boolean array indexing

答案 1 :(得分:0)

使用np.diff可能会有一些明智的做法,但这是我的解决方案:

import numpy as np
from PIL import Image

img = Image.open('your_image.png').convert('L')
w,h = img.size
a = np.asarray(img.getdata()) # now your image is contained in a long 1D-array
a = np.reshape(a,(h,w)) # reshape from 1D to 2D

# now we delete rows that are duplicates (and later columns)

# initialize b with the first line of a
b = a[0:1,:]
# an index to fill-in b
ib = 0

# scan the lines of a
for ia in range(a.shape[0]-1):
    if (a[ia+1:ia+2,:]!=b[ib, :]).all(): # test for difference
        b = np.concatenate((b,a[ia+1:ia+2,:]), axis=0) # add to b if different
        ib += 1     #increment the index of the current line in b

# now do the same thing with columns. Store the result in c 
c = b[:,0:1]
ic = 0

# scan the columns of b, add to c if different from the last one
for ib in range(b.shape[1]-1):
   if (b[:,ib+1:ib+2]!=c[:,ic]).all():
      c = np.concatenate((c,b[:,ib+1:ib+2]), axis = 1)
      ic += 1