我有一个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)的切片,放在中心。如果每个切片的总和> =切片的长度,我将该数组保存为图像。
这可以用更强大的精确方式完成吗?有没有办法产生更好的结果(更好的窗户!)?
答案 0 :(得分:0)
对于凸曲线,您可以使用极坐标,并通过numpy.argsort
和numpy.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()