Если вы знаете, что контуры замкнуты (в четырехзначном смысле), то вы, вероятно, можете использовать тест луча в бесконечность, который чаще используется для проверки того, находятся ли точки внутри замкнутых многоугольников.(Также при условии, что контуры не пересекаются, что, по-видимому, не может.)
Возьмите любую точку на предполагаемом контуре и перейдите оттуда к «бесконечности» в любом направлении (выберите ось, выровненную по одному(для простоты реализации): если вы дошли до края изображения и пересекли внешний контур нечетное число раз , то контур, на котором вы начали, находится внутри этого контура.
«пересечение» внешнего контура на самом деле немного сложнее, например:
. 1 1 1 1 1 1 1
. 1 . . X X X 1
. 1 . . X . X 1
<-.-1-1-.-X X X 1 : here a naiive implementation counts two crossings
. . 1 1 1 1 1 1
Таким образом, чтобы проверить, пересекает ли луч контур в точке, вам действительно необходимо рассмотреть 3х3 соседние точки.Я думаю, что в итоге вы получите набор случаев, которые выглядят примерно так:
. . .
<-1-1 1 // not crossing
. . .
1 . 1
<-1-1 1 // not crossing
. . .
. . 1
<-1-1 1 // crossing
. . .
1 . .
<-1-1 1 // crossing
. . .
Я не уверен на 100%, что возможно построить согласованный тест для пересечений на основе 4-соединенного контурав окрестностях 3х3, но, вероятно, так оно и есть.
Все это, конечно, зависит от того, что внешний контур замкнут.