如何检验dmperm的结果

转载 2012年03月21日 21:55:52
最初发布于:2011年7月12日,http://blog.sina.com.cn/xialulee
    实际上在整个《读Matlab7.7 IPT的bwlabel函数》系列中,我们还没有给出用Python和csparse实现的bwlabel的完整代码。虽然在《读Matlab7.7 IPT的bwlabel函数(四)——bwlabel大结局:dmperm现身》中用csparse的dmperm消除错误标签,最终得到了标记图像,但是那一切都是以交互的方式运行的,如果想要一个完整的python版的bwlabel,还得再写写代码。
    由于一直没有给出完整的代码,所以很多观众对于bwlabel的运作方式还存在一些误解。这里就来说明一些主要的疑问。
    1. dmperm的作用是什么?
    由《读Matlab7.7 IPT的bwlabel函数(一)——bwlabel1的Python描述》中描述的bwlabel1的算法可知,在bwlabel运行的第一个阶段,bwlabel1这个函数是这样对图像进行标记的。对于如下的图像(x代表非零像素):
x 0
x 0
x x
0 x
x x
x 0
x 0
bwlabel1会从左往右按列扫描(因为Matlab是column-major的系统),每次发现非零像素簇时,就会进行标记,比如扫描完第一列后,会得到:
1 0
1 0
1 x
0 x
2 x
2 0
2 0
然后对第二列进行扫描,一开始发现第二列的那一簇与第一列的标记为1的簇是相邻的,因此将其标记为1:
1 0
1 0
1 1
0 1
2 1
2 0
2 0
但是接着就发现,第二列的这一簇与第一列中标记为2的簇也是相邻的。因此,标记2打错了!标记为2的簇与标记为1的簇是同一簇,不应该被打上不同的标签。
    为了能让后续的代码消除这种错误,bwlabel1的返回值中包含了两个列表rowEquivalences和colEquivalences,用于记录错误的标记。比如上面的例子,标签1和标签2属于同一个非零像素簇,那么此时rowEquivalences = [1]
colEquivalences = [2]
在执行完bwlabel1之后,rowEquivalences和colEquivalences中就记录了所有的错误标签。rowEquivalences[k]与colEquivalences[k]就是属于同一簇,但是打上的不同的标签。
    rowEquivalences和colEquivalences就是消除错误标签的关键数据了。看看下面的这个例子:
rowEquivalences = [1 3 5]
colEquivalences = [2 4 2]
可以看出1和2属于同一簇,3和4属于同一簇,5和2属于同一簇。再仔细观察,可以发现1,2,5是同一簇。于是合并错误标签的问题就变成了一个典型的无向非连通图的connected components的问题。在《读Matlab7.7 IPT的bwlabel函数(三)——如果是xialulee,会怎样》中,我们是用图的遍历来解决的。而Matlab则使用Dulmage-Mendelsohn decomposition来实现相同的功能。
    要使用Dulmage-Mendelsohn decomposition来获取图的connected components,首先需要用矩阵的形式来表达图。表达的方法在图论里好像叫做邻接矩阵。例如:
A[m, n] = 1
表示元素m到n有通路;
A[m, n] = 0
表示元素m到n没有通路。
    对于无向图,如果m到n有通路,则n到m也有通路,所以:
A[n, m] = 1 if A[m, n] = 1
因此无向图的矩阵是一个对称矩阵。又由于每个元素都可以到达自身,因此有:
A[n, n] = 1
因此无向图的矩阵是一个对角线元素为1的对称矩阵。
    Dulmage-Mendelsohn decomposition通过对这个对称矩阵进行行和列的交换,使其变成分块对角阵。则每一个分块对应图的一个connected component。在Matlab中,直接使用Matlab的dmperm函数即可实现Dulmage-Mendelsohn decomposition,如果使用其它的语言和平台,比如C/C++,Python,则可以借助csparse库(参见http://people.sc.fsu.edu/~burkardt/c_src/csparse/csparse.html)的cs_dmperm函数来实现。
    有很多观众在此提出了一个疑问:有时候csparse的cs_dmperm与Matlab的dmperm结果不同!这样还能给出最后的结果吗?要回答这个问题,还是得回顾Dulmage-Mendelsohn decomposition在bwlabel中的作用:找出错误标签的connected components。比如,如果元素1 2 5构成一个connected component,则可以写为:
1 2 5
1 5 2
2 1 5
2 5 1
都是一样的,在这里,元素出现的顺序并不重要,重要的是将属于一个connected component的元素放在一起。所以不要直接比较Matlab的dmperm和csparse的cs_dmperm的结果,而是要比较它们的分组结果
    这里选择一个实际的例子来说明如何检验dmperm的输出。数据来自《VC和matlab 测试dmperm函数的图像》
rowEquivalences = [28    28    13    13    28    13    13    13    28    13    28    28    13    13    13    28    13    28    28    13    28    13    28    28    13    28    13    13    13    20    20    20    20    26    20    13    13    26    20    13    20    20    26    13    20    20    20    20    13    20    13    20    26    20    13    20    20    23    20    23    20    15    13    23    20    20    18    19    20    20    20    19    20    13   

相关文章推荐

matlab命令A-M

================================================================ A a  abs 绝对值、模、字符的ASCII码值  aco...

halcon学习笔记——机器视觉工程应用的开发思路

最近因为项目需要用到halcon,一点没接触过halcon的我只能慢慢摸索。halcon没有教材,不像opencv,虽然只是第一版,但至少有个入门的介绍书籍,而halcon只能自个探索了。   ...

Union-Find 算法(并查集)

作者:disappearedgod 文章出处:http://blog.csdn.net/disappearedgod/article/details/25202183 时间:2014-5-7 1...

龟兔赛跑预测 (最后一种检验结果不正确)

问题 /*基础练习 龟兔赛跑预测  问题描述    在与乌龟的比赛中,一旦任一秒结束后兔子发现自己领先t米或以上,它们就会停下来休息s秒。     对于不同的兔子,t,s的数值是不同的, ...

为通过 ATS 检测 Tomcat 完全 TLS v1.2、完全正向加密及其结果检验

2017 年起 app store 要求 app 对接的服务器支持 TLS v1.2,否则 ats 检测不予通过。有点强制推 TLS v1.2 的意味。本文介绍如何使 tomcat 强制执行 TLS ...
  • defonds
  • defonds
  • 2017年01月12日 09:08
  • 6936

金域检验结果报告 图片文件解析

string s2 = "FFD8FFE000104A46494600010100000100010000FFDB00430006040506050406060506070706080A100A0A0...

Scrapy爬虫--爬取食品抽检结果

  • 2017年12月09日 17:41
  • 490KB
  • 下载

[自用门户]加密解密,每次生成的结果不一样(Base64Utils+RSAUtils)

Base64Utils+RSAUtils+EncryptPropertyPlaceholderConfigurer(加密解密类) /* Copyright (C) 2017 Shanghai Hui...
  • hbhcxs
  • hbhcxs
  • 2017年12月07日 10:07
  • 24

nmap结果解析

  • 2017年12月08日 11:07
  • 189KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何检验dmperm的结果
举报原因:
原因补充:

(最多只允许输入30个字)