OpenCV - морфологическое закрытие удаляет границу изображения

У меня есть очень зашумленное изображение, полученное с помощью микротомографии, и мне нужно получить общую форму, чтобы получить центр тяжести в качестве точки выравнивания. Я использую морфологическое закрытие с многочисленными итерациями, чтобы получить только один контур с хорошими результатами, но операция удаляет границу изображения; следовательно, я теряю данные, когда фигура не находится в центре.

Я пытался использовать разные типы границ, но всегда получаю тот же результат, что и в примерах изображений. Могу ли я использовать этот алгоритм без потери данных границы? Существует ли другой способ получить центр тяжести этих изображений?

Система должна быть автономной для различных «зашумленных форм».

примеры изображений: https://www.dropbox.com/sh/xaalq70skq2fgm2/AABOnfvLKXteavCPMX42Zvzca?dl=0

Код:

kernel = np.ones((3, 3), np.uint8)
i = j = 2

closing1 = cv2.morphologyEx(thresh1.copy(), cv2.MORPH_CLOSE, kernel, iterations = i,\
                                borderType = cv2.BORDER_CONSTANT, borderValue = 0)
(_,contours1,_) = cv2.findContours(closing1.copy(),cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)

closing2 = cv2.morphologyEx(thresh2.copy(), cv2.MORPH_CLOSE, kernel, iterations = j,\
                                borderType = cv2.BORDER_CONSTANT, borderValue = 0)
(_,contours2,_) = cv2.findContours(closing2.copy(),cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)


while len(contours1) != 1:
    i *= 2
    closing1 = cv2.morphologyEx(thresh1.copy(), cv2.MORPH_CLOSE, kernel, iterations = i,\
                                borderType = cv2.BORDER_CONSTANT, borderValue = 0)
    (_,contours1,_) = cv2.findContours(closing1.copy(),cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)


while len(contours2) != 1:
    j *= 2
    closing2 = cv2.morphologyEx(thresh2.copy(), cv2.MORPH_CLOSE, kernel, iterations = j,\
                                borderType = cv2.BORDER_CONSTANT, borderValue = 0)
    (_,contours2,_) = cv2.findContours(closing2.copy(),cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)

person gustavu92    schedule 09.02.2017    source источник
comment
Пожалуйста, попробуйте без указания типа границы, т.е.: closing1 = cv2.morphologyEx(thresh1.copy(), cv2.MORPH_CLOSE, kernel, iterations = i) и т.д.   -  person Miki    schedule 09.02.2017
comment
Спасибо! Это то, что мне нужно!   -  person gustavu92    schedule 09.02.2017
comment
По умолчанию OpenCV уже обрабатывает это, как объяснено в дубликате. Рад, что помог ;)   -  person Miki    schedule 09.02.2017