MSER算法介绍
图像I为一个映射 . 极值区域在图像上的定义为:
1. S是全序的,例如存在满足自反性,反对称性和传递性的二元关系“小于等于”。论文里考虑到的范围仅是S={0,1,2,...,255},但是极值区域可以被定义在实值图像上(S=R)。
4 2 2 4 2 1 4
4 2 2 4 1 2 4
4 3 3 4 3 3 4
4 2 2 4 4 3 4
4 1 1 4 3 4
4 4 4 4 4 4 4
ner: 0. value:1,area: 2, parent: 3
ner: 1. value:1,area: 2, parent: 4
ner: 2. value:2,area: 4, parent: 5
ner: 3. value:2,area: 5, parent: 5
ner: 4. value:2,area: 4, parent: 6
ner: 5. value:3,area: 11, parent: 7
ner: 6. value:3,area: 8, parent: 7
ner: 7. value:4,area: 49, parent: 7
1 3 3 2 3 4 1
1 3 3 2 3 4 1
1 1 1 1 1 3 1
1 3 4 2 1 1 1
1 4 3 2 2 2 1
1 1 1 1 1 1 1
ner: 1. value:2,area: 36, parent: 2
ner: 2. value:3,area: 45, parent: 3
ner: 3. value:4,area: 49, parent: 3
{
1.弹出当前像素的索引和值
2.将邻结点的索引指向当前索引
3.将当前像素结点插入到树中
4.while(依次处理以该像素为中心的8邻域像素)
{
a.邻域像素在图像边界以内
b.邻域像素不是自身
c.邻域像素已经在树中了,也就是说这个像素已经被处理过了
if(满足a,b,c)
{
1.将当前此节点,以及当前此节点的上一层父节点,..., 直到根节点的所有链路节点的shortcut都置为根节点
2.将此邻域节点,以及此邻域节点的上一层父节点,..., 直到根节点的所有链路节点的shortcut都置为根节点
i. 如果当前节点的根节点等于邻域像素的根节点,这种情况下两个树已经加入了同一个树当中了
ii. 如果当前节点的根节点的亮度等于邻域像素的根节点的亮度,此种情况索引将被扩展到具有相同亮度的一个极值区域,因为邻域像素的根节点不会是整个图像的一个极值区域;当前索引的根节点能够安全的被添加到邻域像素的根节点作为邻域像素的孩子结点。
iii.如果当前节点的根节点的亮度大于邻域像素的根节点的亮度并且当前节点是一个极值区域,这时仅仅增加它的层数。这种情况下邻域像素根节点将会是最终整个图像的一个极值区域并且只有唯一的可能性作为添加到当前像素所属的树中当前像素的孩子
}
}
}
/* -----------------------------------------------------------------
* Fit ellipses
* -------------------------------------------------------------- */
ell_pt = ;
if (nout >= ) {
int midx = ;
int d, index, j ; verbose && mexPrintf("Fitting ellipses...\n") ; /* enumerate maxstable regions */
for(i = ; i < ner ; ++i) {
if(! regions_pt [i].maxstable) continue ;
regions_pt [i].maxstable = midx++ ;
} /* allocate space */
acc_pt = mxMalloc(sizeof(acc_t) * nel) ;
ell_pt = mxMalloc(sizeof(acc_t) * gdl * nmer) ; /* clear accumulators */
memset(ell_pt, , sizeof(int) * gdl * nmer) ;
for(index = ; index < nel ; ++ index){
mexPrintf("%d\t",joins_pt[index]) ;
if( == (index+)%dims[]) mexPrintf("\n");
} for(index = ; index < nel ; ++ index){
mexPrintf("%d\t",forest_pt [ index ].parent) ;
if( == (index+)%dims[]) mexPrintf("\n");
} /* for each gdl */
for(d = ; d < gdl ; ++d) {
/* initalize parameter */
memset(subs_pt, , sizeof(int) * ndims) ; //注意这里的0和1下标不是0阶矩和1阶矩,而是表示X和Y之间的均值,相关系数
//例如(0,0)表示corr(X,X), (0,1)表示corr(X,Y),(1,0)表示corr(Y,X),(1,1)表示corr(Y,Y)不要搞混!!! by frisch
if(d < ndims) {
//图像每个像素的行[0], 列坐标[1]坐标, x方向和y方向的均值,by frisch
verbose && mexPrintf(" mean %d\n",d) ;
for(index = ; index < nel ; ++ index) {
acc_pt[index] = subs_pt[d] ;
adv(dims, ndims, subs_pt) ; } } else { //图像每个像素的行[0], 列坐标[1]的相关度计算, by frisch
//corr[0,0](行与行), corr[1,0](行与列), corr[0,1](列与行), corr[1,1](列与列), by frisch
/* decode d-ndims into a (i,j) pair */
i = d-ndims ;
j = ;
while(i > j) {
i -= j + ;
j ++ ;
} verbose && mexPrintf(" corr (%d,%d)\n",i,j) ; /* add x_i * x_j */
//计算相关值,将其放入二维数组
for(index = ; index < nel ; ++ index){
acc_pt[index] = subs_pt[i]*subs_pt[j] ;
mexPrintf("(%d\t%d\t)",subs_pt[i],subs_pt[j]) ;
if( == (index+)%dims[]) mexPrintf("\n");
adv(dims, ndims, subs_pt) ;
}
} for(index = ; index < nel ; ++ index){
mexPrintf("%d\t",acc_pt[index]) ;
if( == (index+)%dims[]) mexPrintf("\n");
} /* integrate parameter */
//对每个区域进行均值或者相关值积分,by frisch
for(i = ; i < njoins ; ++i) {
idx_t index = joins_pt[i] ;
idx_t parent = forest_pt [ index ].parent ;
acc_pt[parent] += acc_pt[index] ;
} /* save back to ellpises */
//保存椭圆参数, 五个参数(包含椭圆的中心点,长短轴幅值,方向向量) by frisch
for(i = ; i < ner ; ++i) {
idx_t region = regions_pt [i].maxstable ; /* skip if not extremal region */
if(region-- == ) continue ;
ell_pt [d + gdl*region] = acc_pt [ regions_pt[i].index ] ;
} /* next gdl */
}
mxFree(acc_pt) ;
}
MSER算法介绍的更多相关文章
- 【原创】机器学习之PageRank算法应用与C#实现(1)算法介绍
考虑到知识的复杂性,连续性,将本算法及应用分为3篇文章,请关注,将在本月逐步发表. 1.机器学习之PageRank算法应用与C#实现(1)算法介绍 2.机器学习之PageRank算法应用与C#实现(2 ...
- KNN算法介绍
KNN算法全名为k-Nearest Neighbor,就是K最近邻的意思. 算法描述 KNN是一种分类算法,其基本思想是采用测量不同特征值之间的距离方法进行分类. 算法过程如下: 1.准备样本数据集( ...
- ISP基本框架及算法介绍
什么是ISP,他的工作原理是怎样的? ISP是Image Signal Processor的缩写,全称是影像处理器.在相机成像的整个环节中,它负责接收感光元件(Sensor)的原始信号数据,可以理解为 ...
- Python之常见算法介绍
一.算法介绍 1. 算法是什么 算法是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制.也就是说,能够对一定规范的输入,在有限时间内获得所要求的输 ...
- RETE算法介绍
RETE算法介绍一. rete概述Rete算法是一种前向规则快速匹配算法,其匹配速度与规则数目无关.Rete是拉丁文,对应英文是net,也就是网络.Rete算法通过形成一个rete网络进行模式匹配,利 ...
- H2O中的随机森林算法介绍及其项目实战(python实现)
H2O中的随机森林算法介绍及其项目实战(python实现) 包的引入:from h2o.estimators.random_forest import H2ORandomForestEstimator ...
- STL 算法介绍
STL 算法介绍 算法概述 算法部分主要由头文件<algorithm>,<numeric>和<functional>组成. <algorithm ...
- Levenshtein字符串距离算法介绍
Levenshtein字符串距离算法介绍 文/开发部 Dimmacro KMP完全匹配算法和 Levenshtein相似度匹配算法是模糊查找匹配字符串中最经典的算法,配合近期技术栏目关于算法的探讨,上 ...
- 机器学习概念之特征选择(Feature selection)之RFormula算法介绍
不多说,直接上干货! RFormula算法介绍: RFormula通过R模型公式来选择列.支持R操作中的部分操作,包括‘~’, ‘.’, ‘:’, ‘+’以及‘-‘,基本操作如下: 1. ~分隔目标和 ...
随机推荐
- Java并发编程学习笔记(三)——对象的组合
重要概念: 1.在设计线程安全类的过程中,需要包含以下三个基本要素: (1)找出构成对象状态的所有变量. (2)找出约束状态变量的不变性条件. (3)建立对象状态的并发访问管理策略. 2.
- Reverse-Daily(3)-DotNetCrackMe1
链接:http://pan.baidu.com/s/1cuYQhK 密码:zjx6 这是一个用c#编写的程序 用dotpeek或者ILSPY反编译可以看到程序结构,主体比较简单,是一个des加密 ...
- BZOJ 3270 && BZOJ 1778 (期望DP && 高斯消元)
BZOJ 3270 :设置状态为Id(x,y)表示一人在x,一人在y这个状态的概率. 所以总共有n^2种状态. p[i]表示留在该点的概率,Out[i]=(1-p[i])/Degree[i]表示离开该 ...
- ubuntu下avd创建和文件传输
进入安卓官网下载安卓sdk并解压到指定路径 在命令行模式下进入安卓文件的toos文件夹下 android avd #在弹出的对话框中新建虚拟机 adb install ~/targetPath/hel ...
- HDU 5289
http://acm.hdu.edu.cn/showproblem.php?pid=5289 给一个数列,求有多少区间,使得这些区间内的最大值减最小值小于k 单调队列的功能:O(1) 插入,删除,最大 ...
- 关系型数据之LinQ基本查询
如下图所示关系型数据,LinQ语句为:
- ARM指令教程
ARM指令教程 ARM汇编程序特点: l 所有运算处理都是发生通用寄存器(一般是R0~R14)的之中.所有存储器空间(如C语言变量的本质就是一个存储器空间上的几个BYTE).的值的处理 ...
- 项目中创建单元测试—VS2012
我们在每个项目的开发过程中,开发完一个功能,自己首先需要测试一下,VS提供了很方便的测试功能,可以很容易的创建单元测试,但是在VS2012中类名上点击右键没有『创建单元测试』这个菜单,需要先进行设置一 ...
- 使用SqlLocalDB命令行管理LocalDB
SqlLocalDB.exe start v11.0 SqlLocalDB.exe info v11.0 SQL Server Management Stdio添加管道连接实例 默认实例名(local ...
- Android activity和service的生命周期对比
1Activity生命周期 七个方法 1. void onCreate(Bundle savedInstanceState) 当Activity被第首次加载时执行.我们新启动一个程序的时候其主窗体的o ...