项目记录-圆形边缘修正方法探索2

问题:目前分割得到的圆形边缘和理想边缘相比,部分向外偏离,需要向内收缩 探索方法1: 假设在理想情况下,圆形物体的掩膜是绝对正确的。此时可以遍历当前的边缘点,判断每个边缘点的两侧的掩膜标记是否不同。如果两侧的邻域点掩膜都为0,说明该边缘点偏外,需要向内收缩,使用最近的掩膜点来替换掉越界了的点。
探索方法2:
在前一种方法中,使用最近的掩膜点来替换掉越界了的点,实践效果不理想,下面改进的方法是
1、 不再考虑前后两个弧之间的光滑过渡问题,对每段弧单独处理;
2、从中心开始,尝试向该点移动,第一次碰到掩膜边界时停止移动,用该点来替换。


//找出两侧都是0的点,说明此处需要收缩
    while(i < vecCurContour.size()-1)
    {
        Pt2D curPos(vecCurContour[i]);
        Pt2D nextPos(vecCurContour[i+1]);
        int diffx=nextPos.x-curPos.x;
        int diffy=nextPos.y-curPos.y;
        Pt2D sideA={curPos.x+diffy, curPos.y-diffx};
        Pt2D sideB={curPos.x-diffy, curPos.y+diffx};
        //检测两侧的点是否都为0
        long a=sideA.y*sWidth+sideA.x;
        long b=sideB.y*sWidth+sideB.x;
        if(!(pMaskBuf[a]==0 && pMaskBuf[b]==0))
        {
            i++;
            continue;
        }
        else
        {
            //从此点开始,寻找待处理的线段的终点
            int begin=i-1;
            while(i<vecCurContour.size()-1)
            {
                curPos=vecCurContour[i];
                nextPos=vecCurContour[i+1];
                diffx=nextPos.x-curPos.x;
                diffy=nextPos.y-curPos.y;
                Pt2D sideA={curPos.x+diffy,curPos.y-diffx};
                Pt2D sideB={curPos.x-diffy, curPos.y+diffx};
                //检测两侧的点是否都为0
                a=sideA.y*sWidth+sideA.x;
                b=sideB.y*sWidth+sideB.x;
                if((pMaskBuf[a]==0 && pMaskBuf[b]==1) || (pMaskBuf[a]==1 && pMaskBuf[b]==0))
                {
                   break;
                }
                i++;
            }
            int end=i;
            out<<"终点:"<<end<<endl;
            if(begin<0) continue;
            //起点和终点已经确定,需要对这一段进行替换
            //初始边缘不可靠,改变方法,从中心开始,尝试向该点移动,第一次碰到
            for(int i1=begin;i1<=end;i1++)
            {
                //向中心点平移的单位位移
                int dx=centerx-vecCurContour[i1].x;
                int dy=centery-vecCurContour[i1].y;
                if(dx!=0)dx=dx/abs(dx);
                if(dy!=0)dy=dy/abs(dy);
                //判断下一个点是否为mask,如果是,则停止移动,否则,继续移动
                int newx=vecCurContour[i1].x;
                int newy=vecCurContour[i1].y;
                int pos;
                do
                {
                    newx+=dx;
                    newy+=dy;
                    pos=newy*sWidth+newx;
                }while(!pContourMask[pos] && newx!=centerx && newy!=centery);
                newx-=dx;
                newy-=dy;
                vecCurContour[i1].x=newx;
                vecCurContour[i1].y=newy;
            }
            i++;
        }
    }
    out.close();
}

你可能感兴趣的:(项目问题记录)