Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 找到图像中非最大抑制的有效方法?_Algorithm - Fatal编程技术网

Algorithm 找到图像中非最大抑制的有效方法?

Algorithm 找到图像中非最大抑制的有效方法?,algorithm,Algorithm,有比Ohwr*r更好的算法吗?2D局部最小值和最大值滤波器可以拆分为1D滤波器,然后应用alg 矩形和八角形核上局部最小和最大滤波器的快速算法 基本上对于每个一维向量 分为大小为k的子数组组,其中k为结构大小。 通过以下方式构造2阵列g,h: 结果是: 对于exmaple: 当过滤器大小等于5时,索引4的局部最大值为g[6]和h[2]的最大值。2D局部最小值和最大值过滤器可拆分为1D过滤器,然后应用alg 矩形和八角形核上局部最小和最大滤波器的快速算法 基本上对于每个一维向量 分为大小为k的子

有比Ohwr*r更好的算法吗?

2D局部最小值和最大值滤波器可以拆分为1D滤波器,然后应用alg

矩形和八角形核上局部最小和最大滤波器的快速算法

基本上对于每个一维向量

分为大小为k的子数组组,其中k为结构大小。

通过以下方式构造2阵列g,h:

结果是: 对于exmaple:
当过滤器大小等于5时,索引4的局部最大值为g[6]和h[2]的最大值。

2D局部最小值和最大值过滤器可拆分为1D过滤器,然后应用alg

矩形和八角形核上局部最小和最大滤波器的快速算法

基本上对于每个一维向量

分为大小为k的子数组组,其中k为结构大小。

通过以下方式构造2阵列g,h:

结果是: 对于exmaple: 当过滤器大小等于5时,索引4的局部最大值是g[6]和h[2]的最大值。

是的,您可以在Ow*h*log r时间内完成此操作。由于不断的因素,在r变大之前,这可能不是对朴素算法的胜利。首先,我将描述如何为每个r*r窗口找到一些最大值,然后概述如何限制为唯一的最大值

在Ow*r时间内处理w*r行 首先,一个r*r正方形的最大值是它的r*1列最大值的最大值,你只需要每次计算一次,即使每一个在边上被最多r个更少的邻域共享

为了确定左上角的r*r平方的最大值,计算其r列最大值的垂直位置y[0],y[1],…,y[r-1],然后将它们插入自平衡二叉搜索树BST,其中节点是按字典顺序递增的三元组p,u,v,其中u是行,v是列,p是pix[u,v]。从这个BST读取最右边的最大值告诉我们这个左上角的r*r正方形的答案。假设我们已经处理了所有这些最上面的正方形,直到第c-1列中的一个开始,要处理第c列中的一个开始:

从BST摊销Olog r时间中删除pix[y[c-1],c-1],y[c-1],c-1。 计算从0开始的r*1列最大值的垂直位置y[c+r-1],以艰难的方式或时间计算c+r-1。 将pix[y[c+r-1],c+r-1],y[c+r-1],c+r-1插入BST摊销Olog r时间。 从BST摊销Olog r时间中读取最右边的最大值p,u,v:u,v是该r*r邻域内某个最大值的位置。 重复上述步骤以处理图像顶部的所有r*r邻域。请注意,Owr+log r=Owr

在Ow*h*log r时间内处理所有内容 通过对每个起始行分别重复上述操作,可以处理整个图像,但这将导致Ow*h*r时间算法。我们可以将r因子缩减为log r

对于从较低的行开始的r*r邻域,不必从头计算列最大值。我们可以使用类似的方法,通过仅在Olog r时间内从u-1,v开始的r*1块的信息来计算从u,v开始的r*1块的最大值的位置。这样做,而不仅仅是计算和存储each列c,从当前行开始的r*1块中最大值的垂直位置y[c],我们也可以使用自平衡BST,并根据需要使用它们来计算y[]值

具体地说,对于每列c=0,1,…,w-1,我们将保留一列BST CB[c],其条目是按字典顺序递增的对p,u,其中u是一行,p是pix[u,c]。当最初处理图像的顶行时,对于每列c,将r对插入CB[c],然后读取其最右边的最大叶以获得y[c]。鉴于我们刚刚处理了从第i-1行开始的所有邻域,要处理从第i行开始的邻域,请对每列c执行以下操作:

从CB[c]摊销Olog r时间中删除pix[i-1,c],i-1。 将pix[i+r-1,c],i+r-1插入CB[c]摊销Olog r时间。 将y[c]设置为u,其中p,u是CB[c]中最右边的最大叶子。 以上允许将原始程序步骤2中计算y[c+r-1]的Or步骤加速到Olog r

寻找唯一极大值 如果r*r邻域中存在多个最大像素,则至少以下一项为真:

第二高的列最大值等于最高的列最大值。当最大值在不同的列中时会发生这种情况 包含最高列最大值的列至少包含两次。当单个列中存在多个最大值时,会发生这种情况。 在主算法的第4步中,我们可以很容易地检查这些条件,如果其中任何一个条件成立,则可以抑制邻域的输出,从而生成只报告唯一最大值的算法

要检查第一个条件:在BST中找到最大p、u、v后,按顺序遍历其最近的左s,找到紧靠其前面的叶 伊布林。称之为p',u',v'。当且仅当p'=p时,满足第一个条件。这需要很长时间

要检查第二个条件:在BST中找到最大的p,u,v后,在CB[v]中查找其最右边的叶,该叶必然是p,u,以及其最近的左边同级p',u'。当且仅当p'=p时满足第二个条件。

是,您可以在Ow*h*log r时间内完成此操作。由于不断的因素,在r变大之前,这可能不是对朴素算法的胜利。首先,我将描述如何为每个r*r窗口找到一些最大值,然后概述如何限制为唯一的最大值

在Ow*r时间内处理w*r行 首先,一个r*r正方形的最大值是它的r*1列最大值的最大值,你只需要每次计算一次,即使每一个在边上被最多r个更少的邻域共享

为了确定左上角的r*r平方的最大值,计算其r列最大值的垂直位置y[0],y[1],…,y[r-1],然后将它们插入自平衡二叉搜索树BST,其中节点是按字典顺序递增的三元组p,u,v,其中u是行,v是列,p是pix[u,v]。从这个BST读取最右边的最大值告诉我们这个左上角的r*r正方形的答案。假设我们已经处理了所有这些最上面的正方形,直到第c-1列中的一个开始,要处理第c列中的一个开始:

从BST摊销Olog r时间中删除pix[y[c-1],c-1],y[c-1],c-1。 计算从0开始的r*1列最大值的垂直位置y[c+r-1],以艰难的方式或时间计算c+r-1。 将pix[y[c+r-1],c+r-1],y[c+r-1],c+r-1插入BST摊销Olog r时间。 从BST摊销Olog r时间中读取最右边的最大值p,u,v:u,v是该r*r邻域内某个最大值的位置。 重复上述步骤以处理图像顶部的所有r*r邻域。请注意,Owr+log r=Owr

在Ow*h*log r时间内处理所有内容 通过对每个起始行分别重复上述操作,可以处理整个图像,但这将导致Ow*h*r时间算法。我们可以将r因子缩减为log r

对于从较低的行开始的r*r邻域,不必从头计算列最大值。我们可以使用类似的方法,通过仅在Olog r时间内从u-1,v开始的r*1块的信息来计算从u,v开始的r*1块的最大值的位置。这样做,而不仅仅是计算和存储each列c,从当前行开始的r*1块中最大值的垂直位置y[c],我们也可以使用自平衡BST,并根据需要使用它们来计算y[]值

具体地说,对于每列c=0,1,…,w-1,我们将保留一列BST CB[c],其条目是按字典顺序递增的对p,u,其中u是一行,p是pix[u,c]。当最初处理图像的顶行时,对于每列c,将r对插入CB[c],然后读取其最右边的最大叶以获得y[c]。鉴于我们刚刚处理了从第i-1行开始的所有邻域,要处理从第i行开始的邻域,请对每列c执行以下操作:

从CB[c]摊销Olog r时间中删除pix[i-1,c],i-1。 将pix[i+r-1,c],i+r-1插入CB[c]摊销Olog r时间。 将y[c]设置为u,其中p,u是CB[c]中最右边的最大叶子。 以上允许将原始程序步骤2中计算y[c+r-1]的Or步骤加速到Olog r

寻找唯一极大值 如果r*r邻域中存在多个最大像素,则至少以下一项为真:

第二高的列最大值等于最高的列最大值。当最大值在不同的列中时会发生这种情况 包含最高列最大值的列至少包含两次。当单个列中存在多个最大值时,会发生这种情况。 在主算法的第4步中,我们可以很容易地检查这些条件,如果其中任何一个条件成立,则可以抑制邻域的输出,从而生成只报告唯一最大值的算法

要检查第一个条件:在BST中找到最大p,u,v后,以顺序遍历其最近的左同胞的方式找到紧跟在其前面的叶。将其称为p',u',v'。当且仅当p'=p时满足第一个条件。这需要较长的时间


检查第二个条件:在BST中找到最大p、u、v后,查看CB[v]对于其最右边的最大叶子,必须是p,u,以及其最近的左边同级p',u'。当且仅当p'=p时,满足第二个条件。

这对于1D序列线性时间和空间的构造来说是很好的,O1随机访问查找。如何将2D图像拆分为1D序列?它是否可以适应于仅查找unique maxima?首先将快速局部alg应用于行,然后将其应用于列,使用maximun过滤器
啊,聪明!而且可能比我的要快得多,不仅是因为logr因子渐近,还因为它都是顺序/跨步内存访问。但仍然对唯一性最大值感到疑惑。我认为在这个框架中可以检测到唯一性:生成另一个函数g'x,当x%k==1,或者等于fxH&&G'x+k-1/2 | | H>G&&H'x-k-1/2时,x处的最大值被复制。这对于1D序列线性时间和空间构造,O1随机访问查找是很好的。如何将二维图像分割为一维序列?它也能适应于只找到唯一的最大值吗?首先对行应用快速局部alg,然后对列应用它,最大值过滤器是可分离的啊,聪明!而且可能比我的要快得多,不仅是因为logr因子渐近,还因为它都是顺序/跨步内存访问。但仍然对唯一性最大值感到疑惑。我认为在这个框架中可以检测到唯一性:生成另一个函数g'x,当x%k==1,或者等于fxH&&G'x+k-1/2 | H>G&&H'x-k-1/2时,x处的最大值被复制。

 Let I be an image of integer pixel values, height h, width w.
 Let r be a strictly positive integer, We want to extract the positions (row, col) of the local maxima of the image, 
 where local means over a neighborhood of size 2r+1 x 2r+1.

 S = {(x,y), such that strict-argmax_N((x,y), r) I == (x, y)}
    where N((x,y), r) = square of side 2r+1 centered on (x,y).


 img:
 2 0 0 0 0
 1 2 3 0 8
 0 0 0 0 9
 r=1 => 3x3 neighborhoods
  => [(x,y), ...] = [(1, 2), (2, 4)]