О программе: Извлечение региона из растрового изображения - PullRequest
1 голос
/ 05 июня 2009

Я пытаюсь извлечь контурный путь из заданного растрового изображения, я создаю быстрый алгоритм (для меня) на as3, и это:

    //@v source bitmap's vector data
    //@x x to starting extraction
    //@y y to stating extraction
    //@w extraction width
    //@h extraction height
    //@mw source bitmap width
    //@mh source bitmap height
    private function extractRects(v:Vector.<uint>, x:int, y:int, 
                                w:int, h:int, mw:int, mh:int):Array
    {
        var ary:Array = [], yy:int=y, vStart:int, _xx:int, xx:int;
        var lcold:int = 0, lc:int;
        //first line to last line
        while(yy < h)
        {
            //first index of current vector
            vStart = yy * mw + x;
            xx = x;
            lc = 0;
            //first vector to last on current scan
            while(xx < w)
            {
                /*
                    if current vector value (color) is 
                    empty (transparent) then
                    check next
                */
                while(xx < w && !v[vStart])
                {
                    vStart++;
                    xx++;
                }
                //it is not empty so copy first index
                _xx = xx;
                //check till value is not empty
                while(xx < w && v[vStart])
                {
                    xx++;
                    vStart++;
                }
                //create rectangle
                var rr:Rectangle = new Rectangle(_xx, yy, (xx-_xx), 1);
                //if previous line has the same rectangle index
                if(lc < lcold)
                {
                    var oldrr:Rectangle = ary[ary.length - lcold];
                    //if previous neighbour rect on top
                    //has same horizontal position then
                    //resize its height
                    if(oldrr.left == rr.left && oldrr.width == rr.width)
                        oldrr.height++;
                    else
                        ary.push(rr);
                }
                else
                    ary.push(rr);   
                lc++;
                xx++;
            }
            lcold = lc;
            yy++;
        }
        return ary;
    }

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

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

Не могли бы вы порекомендовать мне какое-нибудь известное или лучшее решение?

as3, c ++, c #, vb.net, vb6, delphi, java или аналогичные языки подойдут для ответов.

спасибо за ваше продвижение ..

РЕДАКТИРОВАТЬ ДЛЯ ОЧИСТКИ

Я пытаюсь извлечь координаты x, y непрозрачных пикселей из растрового изображения для рисования по другим данным пути. (32 бит ARGB) (создание формы)

для рисования я мог бы использовать операции lineTo, curveTo, moveTo

moveTo(x, y)
lineTo(x, y)
curveTo(cx, cy, ax, ay)

в своем коде я подумал, что могу извлечь прямоугольники из текущих непрозрачных блоков, и я могу использовать те же фрагменты с операциями moveTo и lineTo для других графических методов

проблема в том, что использование этого метода дает негладкий вид на ребра, которые являются соседними по горизонтали и вертикали

Итак, решением является создание точечной карты по краям, определение окрестности точки, использование операции lineTo (поскольку она генерирует сглаженные линии) между соседними точками в строках, или вычисление расположения точек в ближайшей области окружности и использование метода curveTo. ..

мой вопрос: не могли бы вы порекомендовать мне некоторые алгоритмы или методы для извлечения работы.

извините за мой английский

спасибо

1 Ответ

0 голосов
/ 29 июля 2009

То, что вы ищете - это растровое / растровое изображение для векторного программного обеспечения. Чтобы получить хороший качественный результат, необходимо выполнить много нетривиальных шагов. Есть проект с открытым исходным кодом под названием Potrace, который делает это - нажмите здесь для технического описания того, как он работает . Если вы хотите попробовать его алгоритм в программе с графическим интерфейсом, вы можете использовать Inkscape с его функцией Trace Bitmap.

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