2D numpy Array to skimage

时间:2017-05-09 22:53:38

标签: python numpy matplotlib scikit-image

我想知道如何以[x,y]形式转换numpy数组(像素位置):

[[ 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

我如何规范化这些数据,使其形式为skimage所需?

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

2 个答案:

答案 0 :(得分:1)

不调用任何外部函数,这是将一系列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))

Fibonacci sequence in 2D skimage format

答案 1 :(得分:0)

找到一个体面的解决方案。使用matplotlib生成像素位置的rgb表示[x,y] numpy&gt;使用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