У меня есть двоичное изображение с белыми несколькими белыми пятнами, а фон черный. Я хочу подсчитать количество капель на этом изображении в python
Я попробовал функцию python cv.findContours из cv и skimage.measure.find_contours(), но это не дало мне требуемого результата.
img = cv2.imread('test.png', 0)
con = measure.find_contours(img, 0.8)
fig, ax = plt.subplots()
ax.imshow(img, interpolation='nearest', cmap=plt.cm.gray)
for n, contour in enumerate(con):
ax.plot(contour[:, 1], contour[:, 0], linewidth=2)
ax.axis('image')
ax.set_xticks([])
ax.set_yticks([])
plt.show()
# Trying to save image with contours but failed.
cv2.imwrite('contour.png', con)
# No idea how to count instances of a blob in a binary image
Вы можете использовать функцию, которая подсчитывает количество подключенных компонентов. Есть реализованные варианты, и вы можете легко написать свой собственный. вот пример кода:
def connected_components(image):
# list of tags we have used
tags = []
# current tag (remember 1 and 0 are already in image so start from 2)
tag = 2
# counter
cntr = 0
for i in range(image.shape[0]):
for j in range(image.shape[1]):
if image[i, j] != 0:
if i != 0 and j != 0 and image[i, j-1] != 0 and image[i-1, j] != 0 and image[i-1, j] != image[i, j-1]:
image[i, j] = image[i, j - 1]
tags.remove(image[i - 1, j])
cntr -= 1
image[image == image[i - 1, j]] = image[i, j]
elif i != 0 and image[i-1, j] != 0:
image[i, j] = image[i-1, j]
elif j != 0 and image[i, j-1] != 0:
image[i, j] = image[i, j-1]
else:
image[i, j] = tag
tags.append(tag)
tag += 1
cntr += 1
return image, tags, cntr
что делает этот код: мы перемещаемся по каждому пикселю, и если это новый пиксель с 1 значением:
вы также можете использовать предопределенные методы, такие как этот пример.
Мне очень жаль, что я неправильно понял ваш вопрос. Я обновил свой ответ. надеюсь, что это поможет.
Спасибо за ваш ответ, но опять же, как я могу подсчитать «новые» экземпляры?