关于:从位图提取区域

时间:2009-06-04 23:14:55

标签: algorithm

我正在尝试从给定的位图中提取轮廓路径,我在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;
    }

通过上面的方法,我通过绘制rects来提取区域并创建形状。 由于视图不流畅,绘图对我来说不是一个好的解决方案。

为了让视线更加平滑,我应该使用直线或曲线但是,相邻点的计算对我来说是一个非常头疼的问题。

你可以向我推荐一些众所周知的或更好的解决方案吗?

as3,c ++,c#,vb.net,vb6,delphi,java或类似的语言将很好的答案。

感谢您的进步..

编辑清除

我正在尝试从位图中提取非透明像素的x,y坐标,以绘制不同的路径数据。 (32位ARGB)(创建形状)

到绘图我可以使用lineTo,curveTo,moveTo operations

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

在我的代码中,我认为我可以提取当前非透明块的矩形,并且我可以在其他图形方法上使用与moveTo和lineTo操作相同的rects

问题是使用这种方法在边缘上给出不平滑的外观,这是更直的水平或垂直

因此,解决方案是在边上创建点图,检测点邻域,使用lineTo操作(因为它生成抗锯齿线)在行上的相邻点之间,或计算最近圆区域上的点放置并使用curveTo方法..

我的问题是你能推荐一些提取工作的算法或方法。

抱歉我的英文

谢谢

1 个答案:

答案 0 :(得分:0)

您正在寻找的是位图/光栅图像到矢量软件。为了获得高质量的结果,必须执行许多非平凡的步骤。有一个名为Potrace的开源项目可以做到这一点 - click here for a technical description of how it works。如果您想在GUI程序中尝试其算法,可以使用Inkscape及其Trace Bitmap函数。