Я так часто вижу это здесь, на 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](https://i.stack.imgur.com/a64PO.png)
Этот результат получается после простого фильтра с верхним колпачком, в котором хранятся только тонкие вещи, за которым следует открытие пути, в котором хранятся только длинные вещи. Эта комбинация удаляет крупномасштабное затенение, а также небольшие неровности и прочее. После фильтрации простой порог Оцу дает двоичное изображение, которое отмечает все пиксели в трещине.
Примечания:
- Входное изображение - это ОП, отправленное в другом вопросе , и является входом для изображений, опубликованных в этом вопросе.
- Я использую PyDIP, который вы можете получить на GitHub и нужно скомпилировать самостоятельно. Надеюсь, скоро у нас будет бинарный дистрибутив. Я автор.