Как подсчитать количество экземпляров BLOB-объекта в бинарном изображении (белые BLOB-объекты и черный цвет фона)

У меня есть двоичное изображение с белыми несколькими белыми пятнами, а фон черный. Я хочу подсчитать количество капель на этом изображении в 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
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
597
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать функцию, которая подсчитывает количество подключенных компонентов. Есть реализованные варианты, и вы можете легко написать свой собственный. вот пример кода:

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 значением:

  • если ни один пиксель слева или справа также не равен 1, мы даем ему новый тег.
  • если пиксели слева от него или вверх также равны 1, мы даем ему тот же тег, что и в
  • если пиксели слева от него а также вверх также равны 1:
    • мы даем ему тот же тег, что и они, если они уже имеют такой же тег
    • мы даем ему тот же тег, что и один из них, и превращаем все пиксели со вторым тегом в первый тег, поэтому эти компоненты теперь являются одним (поскольку они связаны этим пикселем)

вы также можете использовать предопределенные методы, такие как этот пример.

Спасибо за ваш ответ, но опять же, как я могу подсчитать «новые» экземпляры?

Waqas Tahir 11.06.2019 12:20

Мне очень жаль, что я неправильно понял ваш вопрос. Я обновил свой ответ. надеюсь, что это поможет.

Bahman Rouhani 11.06.2019 12:51

Другие вопросы по теме