Формирование структуры изображения программно (предпочтительно кодирование C # / C ++ или псевдокодирование) - PullRequest
2 голосов
/ 01 апреля 2011

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

Чтобы было понятнее, я говорю о прозрачном изображении. Скажем, у меня есть изображение PNG с многоугольной формой посередине или, что гораздо лучше, вид сверху на остров. Теперь я хотел бы проследить контуры и установить цвет. Как и эффект «Удар» в Adobe Photoshop.

Я достиг этого, я создал программу, которая отслеживала бы контуры. Но моя проблема в том, что это линейное сканирование. Слева направо, затем вниз, затем снова слева направо. Я уверен, что вы поняли идею. Я хотел, чтобы трассировка проходила, как если бы вы отслеживали ее вручную. Как вы с трассировкой круга.

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

Надеюсь, мой запрос понятен. Любые предложения, образцы приветствуются. Но гораздо лучше, если это в форме кода c # или псевдокода с некоторыми пояснениями.

Заранее большое спасибо.

- Дополнение:

Кроме того, я хотел бы (наверное, я забыл упомянуть) записывать координаты обводки в последовательном порядке. Так что я мог манипулировать ими позже. Вот почему я хотел сделать изложение логики в порядке потока. Это алгоритм, который я ищу специально. Большое спасибо!

Ответы [ 2 ]

5 голосов
/ 01 апреля 2011

Одним из способов является использование общего алгоритма обнаружения ребер.Например, Обнаружение краев Собеля .Однако он не оптимизирован для чистых, сглаженных двухцветных изображений, как в примере ниже, поэтому он дает несколько грубый результат.Чтобы лучше сохранить сглаживание и получить плавный результат, я предлагаю следующий алгоритм:

Image blurredImg = gaussianBlur(sourceImg, blurRadius = desiredOutlineWidth);
const float sharpnessCoef = 0.1; // value may need tuning or may need to
                                 // depend on the blur radius
Image dilatedImg = from blurredImg, map all pixels with
                   brightness > sharpnessCoef to white and
                   multiply the rest by 1 / sharpnessCoef
Image smoothResult = subtract sourceImg from dilatedImg

Пример:

edge detection

1 голос
/ 01 апреля 2011

Рассмотрите возможность использования методов обработки изображений, таких как этот:

http://www.codeproject.com/KB/cs/Canny_Edge_Detection.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...