Заполнение краев с помощью заливки не работает должным образом - PullRequest
0 голосов
/ 18 ноября 2018

Я использую openCV в Python для обнаружения трещин в бетоне.Я могу использовать обнаружение острых краев, чтобы обнаружить трещины.Далее мне нужно заполнить края.Я использовал операцию залива OpenCV, но некоторые пробелы заполнены, а некоторые не заполнены. изображение слева - это входное изображение, а справа - заливное изображение .Я предполагаю, что это потому, что мои края имеют разрывы в точках.Как мне решить это?Мой код для заливки:

im_th1 = imginput
im_floodfill = im_th1.copy()
# Mask used to flood filling.
# Notice the size needs to be 2 pixels than the image.
h, w = im_th1.shape[:2]
mask = np.zeros((h + 2, w + 2), np.uint8)

# Floodfill from point (0, 0)
cv2.floodFill(im_floodfill, mask, (5, 5), 255);

# Invert floodfilled image
im_floodfill_inv = cv2.bitwise_not(im_floodfill)

# Combine the two images to get the foreground.
im_out = im_th1 | im_floodfill_inv
cv2.imshow("Foreground", im_out)
cv2.waitKey(0)

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

Я нашел решение для того, что искал. Размещение здесь, так как это может пригодиться другим. После некоторых исследований в интернете, это было всего 2 строки кода, как было предложено в этом: Как завершить / закрыть контур в python opencv?

Код, который работал для меня:

kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (9, 9))
dilated = cv2.dilate(image, kernel)
eroded=cv2.erode(dilated,kernel)

Результат находится в прикрепленном изображении , которое показывает результаты до и после.

0 голосов
/ 18 ноября 2018

Я так часто вижу это здесь, на SO, каждый хочет использовать обнаружение краев, а затем заполнить область между краями.

Если вы не используете метод обнаружения ребер, который целенаправленно создает замкнутый контур, обнаруженные ребра, скорее всего, не будут образовывать замкнутый контур. И вы не можете заполнить область, если у вас нет замкнутого контура.

В большинстве случаев достаточно фильтрации и простого порога. Например:

import PyDIP as dip
import matplotlib.pyplot as pp

img = dip.Image(pp.imread('oJAo7.jpg')).TensorElement(1) # From OP's other question
img = img[4:698,6:]

lines = dip.Tophat(img, 10, polarity='black')
dip.SetBorder(lines, [0], [2])
lines = dip.PathOpening(lines, length=100, polarity='opening', mode={'robust'})
lines = dip.Threshold(lines, method='otsu')[0]

output of script

Этот результат получается после простого фильтра с верхним колпачком, в котором хранятся только тонкие вещи, за которым следует открытие пути, в котором хранятся только длинные вещи. Эта комбинация удаляет крупномасштабное затенение, а также небольшие неровности и прочее. После фильтрации простой порог Оцу дает двоичное изображение, которое отмечает все пиксели в трещине.

Примечания:

  • Входное изображение - это ОП, отправленное в другом вопросе , и является входом для изображений, опубликованных в этом вопросе.
  • Я использую PyDIP, который вы можете получить на GitHub и нужно скомпилировать самостоятельно. Надеюсь, скоро у нас будет бинарный дистрибутив. Я автор.
...