最大轮廓和投影

最大轮廓和投影
    
       最近非常多的用到了最大轮廓和投影运算。回想起来,这两种算法的确是属于非常常见的基础算法。这里加以总结和提取。
      最大轮廓:
      前提是图像经过了灰度和阈值处理,也可以直接处理canny的结果,有些时候需要预先经过色彩域的转换。最后得到的结果,应该是一个contour,当然可以采用一定的方法处理得到外接矩形。
复制代码
投影处理:
     这里的前提和最大轮廓是非常相似的。投影主要关心的是通过投影图像,获得原始图像中的ROI,或者获得有多少个上波形多少个下波形这些定量的结果。

    Vector<int> vectorV; //横向循环
    Vector<int> vectorH; //纵向循环
    Vector<int> VUpper;
    Vector<int> VDown;
    vector<int> HUpper;
    vector<int> HDower;

   // 做横向循环
    for (int i=0;i<ostu.cols;i++)
    {
        Mat data = ostu.col(i);
        int itmp = countNonZero(data);
        vectorV.push_back(itmp);
    }
    //上波形为VUpper,下波形为VDown
    for (int i=1;i<vectorV.size();i++)
    {
        if (vectorV[i-1] == 0 && vectorV[i]>0)
        {
            VUpper.push_back(i);
        }
        if (vectorV[i-1]>0 && vectorV[i] == 0)
        {
            VDown.push_back(i);
        }
    }
    //做纵向循环,这个往往处理的是横向循环的结果图片
      for (int j=0;j<ostu.rows;j++)
        {
            Mat data = roitmp.row(j);
            int itmp = countNonZero(data);
            vectorH.push_back(itmp);
        }
        for (int j=0;j<vectorH.size()-1;j++)
        {   
            if (vectorH[j]>0 && vectorH[j+1] == 0)
            {
                HDower.push_back(j);
            }
            if (vectorH[j] == 0 && vectorH[j+1]>0)
            {
                HUpper.push_back(j);
            }
        }

     //由于处理的上波形和下波形可能会有问题,需要进行一定的处理
     //这里的一个处理就是提出哪些短暂的空白区域
    for (int j=0;j<HDower.size()-1;j++)
            {
                //得出之间空白的区域
                int iwidth = HUpper[j+1] - HDower[j];
                if (iwidth > 10)
                {
                    iresult = iresult +1;
                }
            }
复制代码

 

 调用方法,得到外接矩阵
                    Rect boundRect = boundingRect(Mat(FindBigestContour(canny)));
     投影处理
      这里的前提和最大轮廓是非常相似的。投影主要关心的是通过投影图像,获得原始图像中的ROI,或者获得有多少个上波形多少个下波形这些定量的结果。
复制代码
投影处理:
     这里的前提和最大轮廓是非常相似的。投影主要关心的是通过投影图像,获得原始图像中的ROI,或者获得有多少个上波形多少个下波形这些定量的结果。

    Vector<int> vectorV; //横向循环
    Vector<int> vectorH; //纵向循环
    Vector<int> VUpper;
    Vector<int> VDown;
    vector<int> HUpper;
    vector<int> HDower;

   // 做横向循环
    for (int i=0;i<ostu.cols;i++)
    {
        Mat data = ostu.col(i);
        int itmp = countNonZero(data);
        vectorV.push_back(itmp);
    }
    //上波形为VUpper,下波形为VDown
    for (int i=1;i<vectorV.size();i++)
    {
        if (vectorV[i-1] == 0 && vectorV[i]>0)
        {
            VUpper.push_back(i);
        }
        if (vectorV[i-1]>0 && vectorV[i] == 0)
        {
            VDown.push_back(i);
        }
    }
    //做纵向循环,这个往往处理的是横向循环的结果图片
      for (int j=0;j<ostu.rows;j++)
        {
            Mat data = roitmp.row(j);
            int itmp = countNonZero(data);
            vectorH.push_back(itmp);
        }
        for (int j=0;j<vectorH.size()-1;j++)
        {   
            if (vectorH[j]>0 && vectorH[j+1] == 0)
            {
                HDower.push_back(j);
            }
            if (vectorH[j] == 0 && vectorH[j+1]>0)
            {
                HUpper.push_back(j);
            }
        }

     //由于处理的上波形和下波形可能会有问题,需要进行一定的处理
     //这里的一个处理就是提出哪些短暂的空白区域
    for (int j=0;j<HDower.size()-1;j++)
            {
                //得出之间空白的区域
                int iwidth = HUpper[j+1] - HDower[j];
                if (iwidth > 10)
                {
                    iresult = iresult +1;
                }
            }
复制代码

 





posted on   jsxyhelu  阅读(84)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示