У меня есть 8-битное бинарное изображение, которое показывает контур круга. Контур имеет ширину всего 1 пиксель. Использование функции view_as_windows позволяет мне генерировать меньшие массивы или окна входного массива, как это изображение, с соседними перекрывающимися окнами. Размер этого изображения 250250.
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)
Это дает мне 1111 перекрывающихся окон. Однако я хочу извлечь только окна вдоль линии круга, чтобы потом снова собрать этот объект. Строка каждого окна должна располагаться по центру или таким образом, чтобы у меня был доступ к информации прямо под кругом.
Это то, что я пробовал до сих пор:
Сначала я заменил значения (0) и (255) на (1) и (0) соответственно. Таким образом, математика немного упрощается.
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) внутри каждого окна, поместив его в центр. Если сумма каждого среза >= длина среза, я сохранил этот массив как изображение.
Можно ли это сделать более точным способом? Есть ли способ добиться лучших результатов (лучшие окна!)?
numpy.where
, чтобы найти координаты для этих пикселей, и вручную извлечь окна посредством нарезки. Кроме того, вы можете подогнать параметры к кругу (центр + радиус), а затем использоватьskimage.draw.circle_perimeter
для создания координат координат для вас. - person Stefan van der Walt   schedule 20.03.2018