对象分割过程中,对没有赋label值的边界使用邻域查找的方式进行标记(1)
来源:互联网 发布:小满软件怎么样 编辑:程序博客网 时间:2024/05/22 17:27
使用边界法进行分割得到分割图后,需要对没有赋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,进行赋值,所以后续该考虑以什么规则在三维
上寻找最近的有效值。
阅读全文
0 0
- 对象分割过程中,对没有赋label值的边界使用邻域查找的方式进行标记(1)
- 对象分割过程中,对没有赋label值的边界使用邻域查找的方式进行标记(2)
- Html中Label标记的作用和使用介绍
- Arcgis实现为栅格中nodata或者数据质量差的点赋邻域值Nibble工具
- 二值图像查找边界,并对边界进行搜索,剔除小边界
- 使用 C# 进行 label 打印 的两种方式
- 使用 C# 进行 label 打印 的两种方式 .
- iOS中NSString的分割显示问题(Label中)
- C# 使用 itextsharp 对pdf文件进行分割的几种方法(1)——按页码拷贝分割
- C# 使用 itextsharp 对pdf文件进行分割的几种方法(1)——按页码拷贝分割
- swift将datepicker的值赋给label的方法
- vs2008无法使用查找功能了, 查找进行的过程中被停止
- vs2008突然不能使用查找功能了(找不到要查找的文件 查找进行的过程中被停止)
- vs2008突然不能使用查找功能了(找不到要查找的文件 查找进行的过程中被停止)
- 边界模糊的图像分割
- [日志分割回滚] 使用linux自带的logrotate对nginx日志进行分割(脚本)
- Qt中对QString 类型对象的分割
- 图像标识:4邻域标记算法的两次扫描分析
- 制作开机LOGO就是这么简单!
- php设计模式总结-工厂模式
- APP调起微信支付,JAVA服务端统一下单
- Leetcode——92. Reverse Linked List II && 25. Reverse Nodes in k-Group
- kotlin代码教程
- 对象分割过程中,对没有赋label值的边界使用邻域查找的方式进行标记(1)
- Android.mk详解
- kotlin学习资源链接
- webpack配置中出现的问题
- 在Mac下反编译apk
- WannaCry感染文件恢复方法_企业再也不用愁了!
- 算法(二):分治法
- ORACLE 使用nid修改数据库名称
- tomcat