Удаление последовательных чисел из массива - PullRequest
0 голосов
/ 07 июня 2018

Я новичок в python, но я действительно запутался в этом проекте, который я пытаюсь сделать.У меня есть изображение, показанное здесь .Я пытаюсь найти среднее значение для всех квадратов на изображении, где диапазон пикселей составляет от 0 до 255. В приведенном ниже коде показан метод, который я использовал для вычисления значения для изображения.Проблема, которая возникает, состоит в том, что пиксели / квадраты не имеют одинаковый размер, где некоторые больше, чем другие.Например, в одном случае при просмотре части исходного изображения здесь все квадраты равны, поэтому массивы все равны.Однако на этой картинке мы можем видеть, что правые квадраты меньше левых.

Я думал о создании подмассива из исходного массива, где любой повторныйзначения игнорируются.Например, как показано ниже:

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 голосов
/ 08 июня 2018

Я проверил, будет ли это решение работать на всем вашем изображении, а не на этом небольшом образце, и оно работает.
Я приведу пример только для этого небольшого массива:

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_mask и columns_mask вы можете прочитать здесь: Удалите следующие дубликаты в numpyмассив .
Также обратите внимание, что без np.ix_ будут возвращены только диагональные элементы: Индекс логического массива

0 голосов
/ 07 июня 2018

Возможно, с 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...