对象分割过程中,对没有赋label值的边界使用邻域查找的方式进行标记(1)

	
    使用边界法进行分割得到分割图后,需要对没有赋label的边界进行赋值,本文使用的是基于二维的邻域搜索进行赋值,在二维分割图中找到离当前边界点最近的具有
label值的像素,然后将其label赋给当前边界点。
    
	cv::Mat labelMat(cv::Size(640,480),CV_8UC1,cv::Scalar(0));
        for(int i=0;i<480;i++)
        {
            for(int j=0;j<640;j++)
            {
                labelMat.at<uchar>(i,j)=labelColor[640*i+j];
            }
        }
	
	labelColor为我的分割结果,以数组的形式存放,放到opencv的Mat中,这样后续处理简单点。
 
	以下为完整代码,思路很简单,先设定搜索半径r,然后以边界点为中心,发散寻找最近的有效label
	cv::Mat labelMat(cv::Size(640,480),CV_8UC1,cv::Scalar(0));
        for(int i=0;i<480;i++)
        {
            for(int j=0;j<640;j++)
            {
                labelMat.at<uchar>(i,j)=labelColor[640*i+j];
            }
        }
        cv::imshow("aaa",labelMat);
        int r=4;
        for(int i=0;i<480;i++)
        {
            for(int j=0;j<640;j++)
            {
                int label_temp=labelMat.at<uchar>(i,j);
                if(label_temp==0)                 //等于0说明是没有赋值的边界点
                {
                    for(int k=1;k<=r;k++)
                    {
                        int start,end;
                        bool leave=false;
                        //(i-k,j-k)  ->  (i-k,j+k)
                        if(i-k>0)
                        {
                            start=(j-k>=0)?j-k:0;                       //行的取值范围为0-479,列为0-639
                            end=(j+k<=639)?j+k:639;
                            for(int temp=start;temp<=end;temp++)
                            {
                                int aa=labelMat.at<uchar>(i-k,temp);
                                if(aa>0)
                                {
                                    labelMat.at<uchar>(i,j)=aa;
                                    labelColor[640*i+j]=aa;
                                    leave=true;
                                    break;
                                }
                            }
                        }
                        //(i-k,j-k)  ->  (i+k,j-k)
                        if(j-k>0)
                        {
                            start=(i-k>=0)?i-k:0;
                            end=(i+k<=479)?i+k:479;
                            for(int temp=start;temp<=end;temp++)
                            {
                                int aa=labelMat.at<uchar>(temp,j-k);
                                if(aa>0)
                                {
                                    labelMat.at<uchar>(i,j)=aa;
                                    labelColor[640*i+j]=aa;
                                    leave=true;
                                    break;
                                }
                            }
                        }
                        //(i-k,j+k)  ->  (i+k,j+k)
                        if(j+k<640)
                        {
                            start=(i-k>=0)?i-k:0;
                            end=(i+k<=479)?i+k:479;
                            for(int temp=start;temp<=end;temp++)
                            {
                                int aa=labelMat.at<uchar>(temp,j+k);
                                if(aa>0)
                                {
                                    labelMat.at<uchar>(i,j)=aa;
                                    labelColor[640*i+j]=aa;
                                    leave=true;
                                    break;
                                }
                            }
                        }
                        //(i+k,j-k)  ->  (i+k,j+k)
                        if(i+k<480)
                        {
                            start=(j-k>=0)?j-k:0;
                            end=(j+k<=639)?j+k:639;
                            for(int temp=start;temp<=end;temp++)
                            {
                                int aa=labelMat.at<uchar>(i+k,temp);
                                if(aa>0)
                                {
                                    labelMat.at<uchar>(i,j)=aa;
                                    labelColor[640*i+j]=aa;
                                    leave=true;
                                    break;
                                }
                            }
                        }
                        if(leave)
                        {break;}
                    }
                }
            }
        }
        cv::imshow("bbb",labelMat);
        cv::waitKey(1);
 
	实际测试时,发现,并不能将这种方法应用于三维,三维分割应该寻找距离当前边界点 欧氏距离最近的有效label,进行赋值,所以后续该考虑以什么规则在三维
     上寻找最近的有效值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值