9crk

9crk

1个粉丝

34

问答

0

专栏

6

资料

9crk  发布于  2015-01-04 21:18:31
采纳率 0%
34个问答
3020

目标分割与统计

本帖最后由 9crk 于 2015-1-4 21:26 编辑

比如桌上一堆米,互相无接触(其实就算有接触,用一些腐蚀算法也可以去掉碰触连接的地方),需要数出来有多少粒米,或者每一粒米的位置(事实上,把每一粒米的位置找出来然后根据此米粒的形状判断其是否缺陷,这是很常见的需求)。

回归正题。
常用的方法是递归,如果找到一个黑点后,向其四周找,如果还有黑点,就继续向其四周找,无限循环下去(当然,为了避免重复,需要建立一个表格,如果这一点找过了,就不对它进行判断了)

这个方法的致命弱点是效率,它可能会需要庞大的stack空间进行递归,并且大小不可控,而且在DSP的BIOS操作系统上,stack错误会直接导致系统死掉。

以下推荐一个分割与标记的方法:two pass,可以将每一个连通区域分开并标记上不同的编号。



步骤如下:
[quote]
(1)第一次扫描:
访问当前像素B(x,y),如果B(x,y) == 1:
a、如果B(x,y)的领域中像素值都为0,则赋予B(x,y)一个新的label:
label += 1, B(x,y) = label;
b、如果B(x,y)的领域中有像素值 > 1的像素Neighbors:
1)将Neighbors中的最小值赋予给B(x,y):
B(x,y) = min{Neighbors}
2)记录Neighbors中各个值(label)之间的相等关系,即这些值(label)同属同一个连通区域;
labelSet = { label_m, .., label_n },labelSet中的所有label都属于同一个连通区域(注:这里可以有多种实现方式,只要能够记录这些具有相等关系的label之间的关系即可)
(2)第二次扫描:
访问当前像素B(x,y),如果B(x,y) > 1:
a、找到与label = B(x,y)同属相等关系的一个最小label值,赋予给B(x,y);
完成扫描后,图像中具有相同label值的像素就组成了同一个连通区域。[/quote]


我来回答
回答2个
时间排序
认可量排序

9crk

1个粉丝

34

问答

0

专栏

6

资料

9crk 2015-01-06 17:51:40
认可0


发个之前的测试图片效果,分割不同深度的灰色进行标记。边框有点偏,可能是尺度原因。


misery

0个粉丝

0

问答

0

专栏

0

资料

misery 2017-09-15 11:41:43
认可0
蛮厉害的!
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
+ 添加网盘链接/附件

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

易百纳技术社区