Как подсчитать количество больших двоичных объектов в двоичном изображении (белые пятна и черный цвет фона) - PullRequest
2 голосов
/ 10 июня 2019

У меня есть двоичное изображение с несколькими белыми каплями белого цвета, а фон черный.Я хочу посчитать количество 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

1 Ответ

0 голосов
/ 11 июня 2019

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

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:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...