Я обнаруживаю капли на изображении с помощью skimage.feature.blob_doh
и получаю области больших двоичных объектов в формате:
A = массив([[121, 271, 30], [123, 44, 23], [123, 205, 20], [124, 336, 20], [126, 101, 20], [126, 153, 20], [156, 302, 30], [185, 348, 30], [192, 212, 23], [193, 275, 23], [195, 100, 23], [197, 44, 20] , [197, 153, 20], [260, 173, 30], [262, 243, 23], [265, 113, 23], [270, 363, 30]])
A: (n, 3) ndarray Массив 2d, каждая строка которого представляет 3 значения, (y,x,sigma)
, где (y,x)
— координаты блоба, а sigma
— стандартное отклонение ядра Гаусса (это примерно просто радиус моей области)
Так что вопрос в том, как выделить все эти области для дальнейшей обработки данных (вычислить средние признаки, произвести кластеризацию и классификацию). Теперь я просто рисую их на графике, но не могу перенести их в растровые\массивные переменные.
И я не хочу использовать для этой задачи библиотеку OpenCV, я должен сделать это, используя numpy/scipy/skimage и другие библиотеки.
fig, ax = plt.subplots(1, 1)
ax.set_title(title)
ax.imshow(image, interpolation='nearest')
for blob in blobs:
y, x, r = blob
c = plt.Circle((x, y), r, color=color, linewidth=2, fill=False)
print c
ax.add_patch(c)
plt.show()
Спасибо за любую помощь!
UPD: получил код обрезки, но он делает что-то странное... кадрирует хорошо, а что с координатами?
def crop_and_save_blobs(image, blobs):
image = np.asarray(image)
for blob in blobs:
y, x, radius = blob
center = (x, y)
mask = np.zeros((image.shape[0],image.shape[1]))
for i in range(image.shape[0]):
for j in range(image.shape[1]):
if (i-center[0])**2 + (j-center[0])**2 < radius**2:
mask[i,j] = 1
# assemble new image (uint8: 0-255)
newImArray = np.empty(image.shape,dtype='uint8')
# colors (three first columns, RGB)
newImArray[:,:,:3] = image[:,:,:3]
# transparency (4th column)
newImArray[:,:,3] = mask*255
newIm = Image.fromarray(newImArray, "RGBA")
plt.imshow(newIm)
plt.show()