现在我有一个白色背景黑色人像轮廓的二值bmp图像(仅有黑白两色)
采用按象素逐点描绘的方法获取抽样点
具体来说是这样的,比如当前点是(x,y)那么此点的八邻域的八个点坐标为(x-1,y-1);(x,y-1);(x+1,y-1);
(x-1,y);(x+1,y);(x-1,y+1);(x,y+1);(x+1,y+1)
我采用的方法就是如果当前点为黑色,那么就将此点周围的八个点全都变成白色,这样就达到了将人体轮廓转化成点图的目的;现在想达到的目标是可以让用户自己选择人体轮廓抽样后还剩下多少个点,我的思路是通过计算整个轮廓的黑色点数目,然后除用户定义的点数,计算出抽样圈数;这样就可以通过将黑色点周围的八个点定义为第一圈,这八个点外面的十六个点为第二圈,以此类推,之外的二十四个点为第三圈......那么我一圈一圈的赋点为白色就可以了,当然这种方法比较笨,不过这是我目前想到的第一个方法:)各位高手,我的情况如上,我的问题是:
1,如何设计一个给圈数赋值的函数?这个函数需要有圈数本身这个参数。
2,可否用递归方法来解决问题?描述是很容易的
   1)如果圈数大于1,那么给当前最大圈赋白色,同时圈数减1;
   2)如果圈数为1,那么只给当前点周围的8个点,也就是第一圈赋白色;
3,关于这个算法,肯定有优化的方法,请大家给出想法,多谢!
4,关于人体轮廓均匀抽样点的问题,我的这个算法应该比较笨,博诸位一笑而已,请各位有更好方法的指点 一二,多谢!给出100分好了,我的分数有限,无法给出太高的分数了,因为这个帖子问的问题比较多,所以也不好给太少的分数,希望各位海涵!

解决方案 »

  1.   

    函数这样,x,y为当前处理的点的坐标,n为圈数.for(i=y-n;i<=y+n;i++)
    {
        for(j=x-n;j<=x+n;j++)
        {
            if(i!=y && j!=x)
                image[i][j]=0xff;//变白色.
        }
    }
      

  2.   

    好的,我试试看;另外,请说说看,“计算整个轮廓的黑色点数目,然后除用户定义的点数,最后计算出抽样圈数”这个问题出现在哪里?我计算轮廓的黑色点数目是用OpenCV里面的一个函数cvNotZero来算的,当然,如果自己依次遍历图像,然后累加出黑色点数目也可以,但是这样就产生了重复运算,也就是说,计算黑色点总数要遍历一遍图像,接下来赋值又要遍历一遍图像有没有什么别的方法?
      

  3.   

    抽了一圈不够,需要再抽一圈,再抽一圈之后,又抽得太多了,可以回填,所有黑点最外面加一圈就复原了.要么就把图像COPY到另一块内存里处理.
      

  4.   

    刚开始也读不懂,以为他要那种dot line ,看到分数这么多嘛,总不能跟自己的口袋过不去吧!!!!!!!!!!!!!!!!!!!
      

  5.   

    汗!原来重赏之下有高人!
    btw,dot line 是什么东西?
      

  6.   

    word 里面的画图不是有
    strict line
    dash line
    dot line
    dash dot line
    dash dot dot line
    这么多吗???
      

  7.   

    上面的函数错了,应该是
    for(i=y-n;i<=y+n;i++)
    {
        for(j=x-n;j<=x+n;j++)
        {
            if(i!=y || j!=x)
                image[i][j]=0xff;//变白色.
        }
    }