求帮助。。。关于联通域的算法

zhangym159 2014-04-26 05:13:21
这样的二值图像要找到各个连通域,检测连通域中是否有大于线宽一半的断裂。。。请问各位大神应该怎么设计算法,有没有相关的代码让我参考??急求
...全文
608 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
chuchenghao1989 2015-03-31
  • 打赏
  • 举报
回复
本质上是搜索算法。
shiter 2014-12-22
  • 打赏
  • 举报
回复
我贴一下一楼的,省的大家找




void FindRegion(IplImage *pImg, CvMemStorage *storage, list<CvRegion> *pRegionList)
{
        //载入图像
        if( pImg != 0 )
        {
                IplImage *pSignedImg = cvCreateImage(cvGetSize(pImg), 8, 1);
                cvZero(pSignedImg);

                cvCopy(pImg, pSignedImg);

                CvSeq *contours = 0, *contoursTemp = 0; 

                int totals = cvFindContours(pSignedImg, storage,&contours, sizeof(CvContour),    //img必须是一个二值图像 storage 用来存储的contours指向存储的第一个轮廓
                        CV_RETR_CCOMP, CV_CHAIN_APPROX_NONE, cvPoint(0,0));
                contoursTemp = contours;

                cvCopy(pImg, pSignedImg);

                list<CvRegion> regionList;        //保持区域
                int nSignedVal = 100;                // 标记像素值

                for(;contoursTemp != 0; contoursTemp = contoursTemp -> h_next)  /// 这样可以访问每一个轮廓  ====横向轮廓
                {
                        CvRegion region;
                        memset(®ion, 0, sizeof(region));

                        CvPoint *pt = (CvPoint*) cvGetSeqElem(contoursTemp, 0);
                        cvFloodFill(pSignedImg, *pt, cvScalarAll(nSignedVal), cvScalarAll(nSignedVal));

                        CvRect rt = cvBoundingRect(contoursTemp);
                        region.boundRt = rt;

                        int nAreaCount = 0;

                        for(int h=rt.y; h<rt.y+rt.height; h++)
                        {
                                BYTE* pDataRow = (BYTE*)(pSignedImg->imageData + h*pSignedImg->widthStep);

                                for(int w=rt.x; w<rt.x+rt.width; w++)
                                {
                                        BYTE* pData = pDataRow + w;

                                        if(*pData == nSignedVal)
                                        {
                                                *pData = 0;
                                                nAreaCount++;
                                        }
                                }
                        }

                        region.nArea = nAreaCount;
                        //printf("nAreaCount = %d...........\n", nAreaCount);

                        region.pSeqCountours = contoursTemp;

                        pRegionList->push_back(region);
                }

                cvZero(pSignedImg);
                cvReleaseImage(&pSignedImg);

                return;
        }
}

void TestFindRegion()
{
        char *pszImgPath = "c:\\holdfill.bmp";
        IplImage* pImg = NULL; //声明IplImage指针

        //载入图像
        if( (pImg = cvLoadImage( pszImgPath, 0)) != 0 )
        {
                CvMemStorage *storage = cvCreateMemStorage(0);   // 内存存储序列

                list<CvRegion> regionList;
                FindRegion(pImg, storage, ®ionList);

                IplImage *pSignedImg = cvCreateImage(cvGetSize(pImg), 8, 1);
                cvZero(pSignedImg);

                int nExternalClrVal = 255;
                int nHoleClrVal = 255;
                for (list<CvRegion>::iterator itr=regionList.begin(); itr!=regionList.end(); itr++)
                {
                        cvDrawContours( pSignedImg,                                                                                                        //img
                                                        itr->pSeqCountours,                                                                                        //countours
                                                        CV_RGB(nExternalClrVal, nExternalClrVal, nExternalClrVal),        //external_color
                                                        CV_RGB(nHoleClrVal, nHoleClrVal, nHoleClrVal),                                //hole_color
                                                        -2,                                                                                                                        //max_level
                                                        CV_FILLED,                                                                                                        //thick_ness
                                                        CV_AA,                                                                                                                //lines_type
                                                        cvPoint(0,0) );                                                                                                //offset
                }

                cvShowImage("img", pImg);
                cvShowImage("pSignedImg", pSignedImg);
                cvWaitKey(0);

                cvReleaseImage(&pSignedImg);
                cvReleaseMemStorage(&storage);      // 也要释放内存序列空间
                cvReleaseImage(&pImg);
        }
}

typedef struct _CvRegion 
 {
         int nArea;

         CvRect boundRt;
         CvSeq *pSeqCountours;
 }CvRegion, *PCvRegion;


zhoujk 2014-12-21
  • 打赏
  • 举报
回复
建议试一下提取骨架,然后在骨架的数据上计算源图的边界偏移
wjw2586121 2014-11-25
  • 打赏
  • 举报
回复
有联通区域算法了,但是对你来说可能太迟了,希望你和以后的人可以借鉴下 http://bbs.rongkevision.com/forum.php?mod=viewthread&tid=45&extra=

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧