Считайте объекты в бинаризованном изображении без скупа - PullRequest
0 голосов
/ 04 марта 2019

Я пытаюсь подсчитать количество объектов в изображении, которое я уже преобразовал в двоичную форму, однако мне не разрешается использовать пакеты scipy или numpy, поэтому я не могу использовать scipy.ndimage.label, какие-либо идеи?Моя попытка насчитывает более 80 объектов, но есть только 13 (подсчитано с помощью scipy)

def label(img):
    n=1
    for i in range(h):
        for j in range(c):
            if img[i][j]==255:
                if img[i-1][j]!=0 and img[i-1][j]!=255:
                    img[i][j]=img[i-1][j]
                elif img[i+1][j]!=0 and img[i+1][j]!=255:
                    img[i][j]=img[i-1][j]
                elif img[i][j+1]!=0 and img[i][j+1]!=255:
                    img[i][j]=img[i][j+1]                    
                elif img[i][j-1]!=0 and img[i][j-1]!=255:
                    img[i][j]=img[i][j-1]
                else:
                    img[i][j]=n
                    if img[i-1][j]!=0:
                        img[i-1][j]=img[i][j]
                    if img[i+1][j]!=0:
                        img[i+1][j]=img[i][j]                        
                    if img[i][j+1]!=0:
                        img[i][j+1]=img[i][j]
                    if img[i][j-1]!=0:
                        img[i][j-1]=img[i][j]                        
                    n+=1
            elif img[i][j]!=0:
                if img[i-1][j]!=0:
                    img[i-1][j]=img[i][j]
                if img[i+1][j]!=0:
                    img[i+1][j]=img[i][j]  
                if img[i][j+1]!=0:
                    img[i][j+1]=img[i][j]  
                if img[i][j-1]!=0:
                    img[i][j-1]=img[i][j]                
    return img,n

1 Ответ

0 голосов
/ 04 марта 2019

Вам понадобится что-то вроде https://codereview.stackexchange.com/questions/148897/floodfill-algorithm,, которое реализует https://en.wikipedia.org/wiki/Flood_fill. Это хорошо подходит для numba или cython, если это возможно для вас.

Возможно, выможно использовать OpenCV, который уже предлагает заливку: https://docs.opencv.org/3.4/d7/d1b/group__imgproc__misc.html#gaf1f55a048f8a45bc3383586e80b1f0d0.

Предположим, вы преобразовали в двоичную форму, поэтому фон имеет один цвет, а объекты - нулевой цвет.Установите c = 2, отсканируйте нулевой пиксель и залейте его цветом c.Теперь увеличьте c, отсканируйте ноль, заполните его, вспените, промойте, повторите.Вы получите в результате каждый объект, имеющий отдельный цвет, чтобы вы могли использовать его в качестве маски изоляции.Отдельные цвета очень полезны при отладке, но, конечно, достаточно трех цветов (или даже двух), если вы просто хотите считать.Окончательное растровое изображение будет равномерно окрашивать фон в двухцветном случае.

Использование 4-элементной окрестности фон Неймана против 8-элементной окрестности сделаетбольшая разница в конечном результате.Для краски легче «просочиться» через диагональное соединение в настройке из 8 элементов.Обнаружение краев и утолщение могут помочь уменьшить нежелательную утечку цвета.

...