@SergeySerge11

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

Или Проще какой алгоритм метода fillpolygon ?
Есть программа, выдает контур изображения, допустим находит лицо, и надо его вырезать на белый фон, контур это массив последовательных точек по часовой стрелки. Нужно наложить этот контур на изображение, и вырезать все пиксели под ним? Контур может быть очень очень очень сложным. К примеру в виде змейки.
У меня как не пытался не получается.
Мой алгоритм.
1. Создаю новый массив [y][x] заношу в него точки контура. (Это думаю при любой реализации)
2. Тут прохожу сверху вниз, слева на права, и жду когда найдется первая точка контура, тогда до следующей точки закрашиваю их.
3. Как только снова точка, то перестаю окрашивать, и так до следующий.
Проблемы, когда Пиковые, ^ V образные и когда точки друг за другом идут.
Есть функция в библиотеках FillPolygon Как она работает??? По сути мой контур это полигон последовательных точек. И мне нужно их закрасить.
6230a90d257bd817554540.png
Такая штука(а ее уже пытался усложнить в разы не помогло), не работает с последовательными точками, к примеру (10,11) (10,12) (10,13) и с точками пика.
for (int i = 0; i < contour.Lenght; i++)
            {
                pixelsContour[contour.Points[i].Y - contour.Y1][contour.Points[i].X - contour.X1] = color;
            } 
            for (int y = 0; y < dy; y++)
            {
                bool isOpenX = false;
               
                for (int x = 0; x < dx; x++)
                {

                    if (isOpenX)
                    {
                        if(pixelsContour[y][x] == color)
                        {
                                isOpenX = false;          /// закрыть         
                        }
                        else
                        {
                           
                                pixelsContour[y][x] = color;
                        }

                    }
                    else
                    {
                        if (pixelsContour[y][x] == color)      
                            isOpenX = true;  
                }
            }
  • Вопрос задан
  • 172 просмотра
Решения вопроса 2
wataru
@wataru Куратор тега Алгоритмы
Разработчик на С++, экс-олимпиадник.
FillPolygon работает через обход в ширину.

Сначала одним циклом покрасьте все точки контура.
Потом берите любую точку внутри полигона, красьте ее и кладите в очередь. Пока очередь не пуста берете точку оттуда, берете 4 или 8 ее соседей и если они не покрашены еще - красите их и кладете в очередь.

Может быть сложность с выбором самой первой точки внутри полигона. Но тут можно аккуратно пройтись вдоль полигона против часовой стрелки и взять первую непокрашенную точку слева относительно обхода. Тут можно для каждой точки найти вектора на двух соседей по контуру, потом перебрать 4-8 соседних пиксилей и взять тот непокрашенный, вектор на который лежит между двумя векторами вдоль контура.
Ответ написан
Комментировать
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Берём матрицу, размером с изображение, заполняем нулями. Отмечаем единицами точки, принадлежащие линиям контура.
Добавляем в очередь точку, заведомо лежащую внутри контура и ставим в неё единицу.
Забираем точку из очереди, добавляем в очередь соседей этой точки (слева, справа, сверху и снизу), в которых ещё не стоит единица, и ставим в них единицы. Повторяем, пока очередь не опустеет.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы