Как я могу реализовать водораздел в сочетании с хитрыми краями в Python OpenCV?

У меня есть следующее изображение:

введите описание изображения здесь

Моя главная цель - найти среднюю толщину слоя остатков на стенке трубы с помощью openCV. Слой, о котором я говорю, обозначен красными стрелками на следующем изображении:

введите описание изображения здесь

Моя первоначальная мысль заключалась в том, чтобы использовать резкие края, чтобы попытаться найти края и отличить желаемый слой от внешнего слоя. Для этого я преобразовал изображение в оттенки серого и передал (сильный) гауссов фильтр, пытаясь удалить нежелательные края из изображения, сохранив желаемый. Затем я использовал команду cv2.Canny с определенным порогом, чтобы получить края, присутствующие в размытом изображении. Я получил достойный результат, как показано на следующем изображении:  введите описание изображения здесь

Теперь проблема в том, что я больше не знаю, что делать. Я имел в виду разделить разные слои трубы, заполнив пустое пространство между острыми краями. После этого мне нужно было как-то найти желаемую толщину слоя, что я снова понятия не имею, как это сделать. Единственный пост, который я нашел, где кто-то, казалось, мог заполнить градиенты затенения между острыми краями, был этот: OpenCV Canny + Watershed, где парень явно использует хитрые края вместо порогов, чтобы заполнить градиентную заливку. Однако его код написан на C ++, и я не уверен, что понимаю, как он это сделал или как я мог бы сделать что-то подобное на Python.

Вот мой код:

import pandas as pd
import numpy as np
import cv2 as cv

path_in = ('test.jpeg')
            
img=cv.imread(path_in)

img_OG = cv.cvtColor(img, cv.COLOR_BGR2GRAY) #transforms in grey

img_blur = cv.GaussianBlur(img_OG,(13,13),0) #strong gaussian filter


######## Canny Edge detection

img_edged = cv.Canny(img_blur, 38, 77)
cv.imshow('canny edge',img_edged)"

Мы будем очень благодарны за любую помощь.


person Felipe Tannus De Mori    schedule 03.05.2021    source источник