使用来自skimage

时间:2018-03-20 18:02:20

标签: python arrays image numpy scikit-image

我有一个8位binary image,向我显示一个圆圈的轮廓。轮廓只有1个像素宽。使用函数view_as_windows可以生成像这张图片一样的输入数组的较小数组或窗口,以及相邻的重叠窗口。此图片的大小为250×250。

from skimage.io import imread
from skimage.util import view_as_windows

fname = "C:\\Users\\Username\\Desktop\\Circle.tif"

array = imread(fname)
window_shape = (50, 50)
step = 20

new_array = view_as_windows(array, window_shape, step=step)

这给了我11×11的重叠窗口。但是,我想只提取沿着圆的线,以便我可以在以后重新组合这个对象。每个窗口的线应位于中央或以某种方式定位,以便我可以访问圆圈下方的信息。

这是我到目前为止所尝试的:

首先,我分别用(1)和(0)替换值(0)和(255)。这样,数学就容易了。

array[array==0] = 1
array[array==255] = 0

然后我在new_array中迭代了窗口。在这种情况下,前两个维度。 new_array.shape是(11,11,50,50)

for j in range(new_array.shape[0]):
    for i in range(new_array.shape[1]):
        Window = new_array[j, i]
        SliceOfWindow = Slice[20:30, 20:30]
        sumAxis0 = np.sum(Slice, axis=0)
        sumSlice = np.sum(sumAxis0)
        if sumSlice >= SliceOfWindow.shape[0]
            imsave(...) 

我在每个窗口中创建了一个较小的形状=(10,10)的切片,放在中心。如果每个切片的总和> =切片的长度,我将该数组保存为图像。

这可以用更强大的精确方式完成吗?有没有办法产生更好的结果(更好的窗户!)?

1 个答案:

答案 0 :(得分:0)

对于凸曲线,您可以使用极坐标,并通过numpy.argsortnumpy.arctan2的角度对边缘像素进行排序。

演示

from skimage import io
import matplotlib.pyplot as plt
import numpy as np

img = io.imread('https://i.stack.imgur.com/r3D6I.png')

# Arbitrary point inside the curve
row_cen, col_cen = 125, 125

# Coordinates of the edge pixels
row, col = np.nonzero(img == 0)

# Put the origin on the lower left corner
x = col - col_cen
y = -(row - row_cen)

# Indices of the centers of the windows
step = 60
idx = np.argsort(np.arctan2(y, x))[::step]

windows = np.zeros_like(img)
size = 15
for _, n in enumerate(idx):
    windows[row[n] - size:row[n] + size, col[n] - size:col[n] + size] = 255

plt.imshow(windows, cmap='gray')
for i, n in enumerate(idx):
    plt.text(col[n], row[n], i, fontsize='14',
             horizontalalignment='center', 
             verticalalignment='center')
plt.show()

Edge and set of windows on the edge