Полагаю, вы знаете, как получить координаты (x,y)
(зеленого) пересечения векторной линии, поэтому я пропущу эту часть.
Начиная с пикселя, ближайшего к (x,y)
, постепенно переходите наружу по квадратной спирали (или по другому желаемому шаблону поиска) от пикселя к пикселю. На каждом шаге проверяйте, находитесь ли вы на черном пикселе с одним и только одним белым соседом Мура . Если это так, то место, где черный пиксель и его белый сосед касаются (возможно, общего угла), является одной из ваших точек (назовите это A). Продолжайте маршировать, пока не найдете еще три (B, C, D). Это будут четыре такие точки, расположенные ближе всего к зеленому пересечению - которые будут хорошо работать в четырех примерах, которые вы показываете в своем вопросе.
Однако этот алгоритм не будет работать, если зеленое пересечение является чем-то наполовину между двумя черными пересечениями; в этом случае он будет смешивать точки из обоих черных пересечений. Если вас это беспокоит, то, как только вы найдете точку А, заново запустите свою марширующую спираль, на этот раз с центром А, и продолжайте марш, пока не найдете B, C, D. Это будет действовать » привязка "к ближайшему черному перекрестку.
Вы можете добавить больше сообразительности, чтобы избежать поиска в одной и той же области дважды; перезапустите или переориентируйте ваш шаблон поиска, как только вы нашли B, и еще раз, когда вы нашли C, и т. д. ... Зависит от того, насколько вы хотите / нуждаетесь.