Заполнение пробелов между границами / контурами на изображениях - PullRequest
0 голосов
/ 27 августа 2018

У меня есть два изображения, которые я хотел бы объединить вместе и заполнить / удалить пробелы между границами после объединения.Изображение слева - это край, а изображение справа - маска.(Не обращайте внимания на маленький патч на правом изображении, но было бы неплохо также удалить его)

Border Predicted Mask

Ожидаемый результат после комбинации

expected result

, но это текущий результат, достигнутый к настоящему моменту

current result

Я пробовал разные стратегии от scikit-image apis, которые включают в себя:

ndi.binary_opening, ndi.binary_closing, morphology.{erosion, dilation, opening, closing}, но, похоже, ни одна из них не работает.

Ответы [ 2 ]

0 голосов
/ 27 августа 2018

Похоже, вам нужно найти центр масс (CoM) функции mask , чтобы определить, какую сторону заполнить, а затем используйте floodFill для изображения edge изCoM как начальная точка.

Вы можете попробовать что-то вроде этого:

# Calculate the Center of Mass
com = np.zeros(2)
sum = np.zeros(2)
for x in range(0, nu_of_rows):
    for y in range(0, num_of_cols):
        com += image[x][y] * np.array([x,y])
        sum += image[x][y]
com /= sum

# FloodFill a new image
h, w = mask_img.shape[:2]
new_image = mask_img.copy()
temp = np.zeros((h+2,w+2),np.uint8) # Needs to be 2 pixels wider/higher
cv2.FloodFill(new_image, temp, coi, 255, flags=cv2.FLOODFILL_MASK_ONLY)

Это будет работать, если линия в вашей маске edge и изображения имеют значения 255 и фоны 0.Если это не так, сначала инвертируйте два изображения с помощью следующей команды:

inverted_img = cv2.bitwise_not(img)

Примечание: Я проверял это не с вашим изображением, а с одним из моих.Так что, возможно, вам придется что-то изменить здесь и там.Вот мой грубый пример работы:

enter image description here

0 голосов
/ 27 августа 2018

Я думаю, что это может быть основой для стратегии ...

Шаг 1:

Начните с "изображения края" ,Случайно выберите любой белый пиксель.Залить заливку черным, используя этот пиксель в качестве начального или начального значения.Это должно заполнить одну сторону края.Запомните семя и возьмите центроид (и, возможно, область) нового, заполненного черной областью.Инвертируйте заполненное изображение и получите центроид другой части изображения.

Теперь вы знаете центроиды обеих сторон края - как отмечено красным цветом ниже:

enter image description here

Шаг 2:

Теперь перейдите к изображению маски.Возможно используйте расширение / эрозию, чтобы заполнить любые маленькие отверстия.Затем запустите «маркировку» на изображении, чтобы получить список смежных черных капель, их центроидов и областей.Выберите самый большой шарик по области.

Теперь у вас должен быть центр тяжести самого большого шарика, как показано зеленым цветом ниже:

enter image description here

Шаг 3:

Теперь выберите ближе две красные точки к зеленой и используйте соответствующее семя для заполнения.


Может лучшена шаге 1 многократно выбирайте белые начальные точки случайным образом, пока не получите другой центроид, вместо того, чтобы делать инверсию.Это потому, что если вы просто инвертируете и получаете центроид, вы не знаете хорошего начального пикселя.Не уверен, что центроид - хорошее семя.

...