打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
轮廓寻找算法(contour find)

轮廓寻找算法建立在斑(blob)寻找基础之上,这个算法有参考杨淑莹的图像处理,有两个版本,第一版本c#代码如下:

 private void SingleTrack(ref byte[] image, int w, int h, ref List<Point> list, int i, int j, uint threshold)
        {
            CPointNode1[] direct = new CPointNode1[8];
            direct[0].x = 1; direct[0].y = 0;
            direct[1].x = 1; direct[1].y = -1;
            direct[2].x = 0; direct[2].y = -1;
            direct[3].x = -1; direct[3].y = -1;
            direct[4].x = -1; direct[4].y = 0;
            direct[5].x = -1; direct[5].y = 1;
            direct[6].x = 0; direct[6].y = 1;
            direct[7].x = 1; direct[7].y = 1;
            Point temppt = new Point();
            int nx = i, ny = j; int indexindex = 0;
            temppt.X = nx;
            temppt.Y = ny;
            list.Add(temppt);
            do
            {
                indexindex = NextcontourPoint(ref image, w, h, nx, ny, indexindex, ref list, threshold);
                if (indexindex == 9) break;
                nx = direct[indexindex].x;
                ny = direct[indexindex].y;
            }
            while (nx != i || ny != j);
        }

     private int NextcontourPoint(ref byte[] image, int w, int h, int i, int j, int entrelinkcode, ref List<Point> list, uint threshold)
        {
             CPointNode1[] direct = new CPointNode1[8];
            direct[0].x = 1; direct[0].y = 0;
            direct[1].x = 1; direct[1].y = -1;
            direct[2].x =0; direct[2].y = -1;
            direct[3].x = -1; direct[3].y = -1;
            direct[4].x = -1; direct[4].y = 0;
            direct[5].x = -1; direct[5].y = 1;
            direct[6].x = 0; direct[6].y = 1;
            direct[7].x = 1; direct[7].y = 1;
            int startindex = entrelinkcode 3 8;
          //  int i = 0;
            for (int ii = 0; ii <= 7; ii )
            {
                int indexindex = (startindex - ii) % 8;
                int nx = i direct[indexindex].x;
                int ny = j direct[indexindex].y;
                if (image[nx * w ny] == threshold)
                {
                    Point temppt = new Point();
                    temppt.X = nx;
                    temppt.Y = ny;
                    list.Add(temppt);
                    return indexindex;
                }
            }
            return 9;
        }

第二版本c#代码如下:

    private void FindContinueFigure2(ref byte[] image, int w, int h, ref List<Point> list, int i, int j, uint threshold)//threshold //default=255
        {
            Point startpoint = new Point();
            Point currentpoint = new Point();
            CPointNode1[] direct = new CPointNode1[8];
            direct[0].x = -1; direct[0].y = 1;
            direct[1].x = -1; direct[1].y = 0;
            direct[2].x = -1; direct[2].y = -1;
            direct[3].x = 0; direct[3].y = -1;
            direct[4].x = 1; direct[4].y = -1;
            direct[5].x = 1; direct[5].y = 0;
            direct[6].x = 1; direct[6].y = 1;
            direct[7].x = 0; direct[7].y = 1;
    
            int startdirect = 3;       
            bool findstartpoint = false;

            Point temppt = new Point();

            temppt.X = startpoint.X = i;
            temppt.Y = startpoint.Y = j;
            list.Add(temppt);

            currentpoint.X = startpoint.X;
            currentpoint.Y = startpoint.Y;

            while (!findstartpoint)
            {
                bool findpoint = false;
                while (!findpoint)
                {
                    int ay = (currentpoint.Y direct[startdirect].y);
                    int ax=currentpoint.X direct[startdirect].x;
                  //  if(ax>0&&ax<w&&ay>0&&ay<h)
                    if (image[ay * w ax] == threshold)
                    {
                        findpoint = true;
                        //  image[(currentpoint.Y direct[startdirect].y) * w currentpoint.X direct[startdirect].x] = 0;
                        temppt.X = currentpoint.X = currentpoint.X direct[startdirect].x;
                        temppt.Y = currentpoint.Y = currentpoint.Y direct[startdirect].y;
                        list.Add(temppt);

                        if (currentpoint.X == startpoint.X &&
                            currentpoint.Y == startpoint.Y)
                        {
                            findstartpoint = true;

                        }
                        startdirect--;
                        if (startdirect == -1)
                            startdirect = 7;
                        startdirect--;
                        if (startdirect == -1)
                            startdirect = 7;
                    }
                    else
                    {
                        startdirect ;
                        if (startdirect == 8)
                            startdirect = 0;
                    }
                }
            }
        }

  public struct CPointNode1
    {
        public int x;
        public int y;

    };

考虑为什么会使用第二版本?答案是,第一版本极少数的结果让人惊诧,明明有轮廓,却只找到一个小圈圈,用了一两年才发现,不知道是什么原因,后来又参考左飞的数字图像处理,才发现是进入链码的值不对导致的。

关于斑和轮廓不想再立篇探讨匹配的应用了,因为在这两篇中,斑和轮廓已经为你提供了用来匹配的足够多的信息特征,关于质心,周长,面积,最远矩,最短矩,凸多边形,外接圆,外接矩形,外接椭圆,以及Hu不变矩的计算......等等,根据个人爱好和具体项目实践应用,任意想象,任意发挥。轮廓与斑,一对孪生姊妹,相辅相成,机器视觉处理基础必备。

待续(慢慢来!...........)每天一点小改变☺

来源:https://www.icode9.com/content-1-321251.html
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
一个简洁的小画板
Android属性动画完全解析(中),ValueAnimator和ObjectAnimator的高级用法
W DIRECT
O_DIRECT
抛物线算法(已知起点、终点、高度)
Android 仿微信朋友圈,缩放归位功能详细解析
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服