Двумерный массив numpy для просмотра изображений

Мне интересно, как преобразовать массив numpy в форму [x, y] (позиции пикселей):

[[ 93  58]
 [ 94  58]
 [ 95  58]
 ..., 
 [ 99 142]
 [100 142]
 [101 142]]

в форму, которая работает с skimage. Для этого, я думаю, мне нужен массив, нормализованный до некоторого размера холста, ширина x высота, который соответствует набору данных (скажем, 500 x 500).

В конечном итоге я хочу выполнить обнаружение края / контура на этом массиве.

http://scikit-image.org/docs/dev/auto_examples/edges/plot_contours.html

Как я могу нормализовать эти данные, чтобы они были в форме, требуемой для скимейджа?

http://scikit-image.org/docs/dev/user_guide/data_types.html


person 0000101010    schedule 09.05.2017    source источник
comment
Честный ответ, я думаю, мне интересно, как нормализовать его на ту же ширину и высоту, чтобы я мог применять функции в skimage (например, find_contours). .astype преобразует тип массива np, но не делает его допустимым форматом изображения.   -  person 0000101010    schedule 10.05.2017
comment
Что означают эти данные? Это координаты пикселей, например (строка, столбец)? Если да, то каково значение пикселя по каждой координате? Возможно, изображение является логическим изображением нулей и единиц, а данные дают координаты единиц? Пожалуйста, объясни.   -  person Warren Weckesser    schedule 10.05.2017
comment
Надо было добавить больше деталей, его пиксельные координаты [x, y]. Где x - это позиция x, а y - позиция y. Необходимо нормализовать эти данные, чтобы они обрабатывались как скайдж, скажем (500x500), где в этом случае у нас были бы пиксели в точках [93, 58], [94, 58] ... и т. Д.   -  person 0000101010    schedule 10.05.2017
comment
Подумал об использовании matplotlib canvas.tostring_rgb () и использовании этого для создания массива numpy изображения (нормализованного до некоторой высоты ширины, которая соответствует набору данных), еще не получил этого на практике   -  person 0000101010    schedule 10.05.2017


Ответы (2)


Без вызова каких-либо внешних функций, это простой способ преобразовать / преобразовать серию точек данных x, y в двумерный массив, подходящий для использования в skimage:

def xy_to_binary2d(ts):
    '''Convert a list of (x,y) tuples to binary 2d format acceptable to skimage.'''
    if ts.dtype != 'int32': 
        print('Only integer input is supported.')

    xmax,ymax = ts.max(axis=0)
    __,ymin = ts.min(axis=0)

    if ymin < 0:
        print('Negative integers are not supported.')

    r = np.zeros((ymax+2,xmax+2))
    for each in ts:r.itemset(each[1],each[0])

    return r

Давайте протестируем это:

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

Вывод:

array([[ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
   [ 0.,  1.,  1.,  0.,  0.,  0.,  0.,  0.,  0.],
   [ 0.,  0.,  0.,  1.,  0.,  0.,  0.,  0.,  0.],
   [ 0.,  0.,  0.,  0.,  1.,  0.,  0.,  0.,  0.],
   [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
   [ 0.,  0.,  0.,  0.,  0.,  1.,  0.,  0.,  0.],
   [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
   [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
   [ 0.,  0.,  0.,  0.,  0.,  0.,  1.,  0.,  0.],
   [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
   [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
   [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
   [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
   [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  1.,  0.],
   [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.]])

И красивая картинка ... plt.imshow(xy_to_binary2d(ts))

Последовательность Фибоначчи в формате 2D-изображения

person Matthew Fairleaf    schedule 15.08.2017
comment
На 10% быстрее для каждого в ts: r.itemset (каждый [1], каждый [0]) - person Matthew Fairleaf; 15.08.2017

Нашел достойное решение. Используйте matplotlib для генерации rgb-представления местоположений пикселей [x, y] numpy> используйте skimage color.rgb2gray, чтобы преобразовать это в формат skimage.

fig = Figure()
canvas = FigureCanvas(fig)
ax = fig.add_subplot(111)

ax.axis('off')
fig.patch.set_facecolor('white')
print(data.shape)
ax.fill(data[:, [0]], data[:, [1]],'black')

# Set canvas size
mi = min(x_min, y_min)
ma = max(x_max, y_max)
ax.set_xlim(mi, ma)
ax.set_ylim(mi, ma)
fig.canvas.draw()
buf = fig.canvas.tostring_rgb()
ncols, nrows = fig.canvas.get_width_height()
new_data = np.fromstring(buf, dtype=np.uint8).reshape(nrows, ncols, 3)
new_data.reshape(nrows, ncols, 3)

image = color.rgb2gray(new_data)

return image
person 0000101010    schedule 10.05.2017