寻找像素和像素组之间最小距离的算法

Posted

技术标签:

【中文标题】寻找像素和像素组之间最小距离的算法【英文标题】:Algorithm for finding minimum distance between pixel and groups of pixles 【发布时间】:2011-07-23 05:32:21 【问题描述】:

我需要算法(最好在 c++ 中,尽管伪代码也可以)来在与一个特定像素具有最小距离的像素组中找到一组。

距离定义为组中每个像素到特定像素的距离之和,每个距离等于|x|+|y|坐标。

如果不够清楚,我会尽力澄清你

谢谢

【问题讨论】:

我正在寻找一些有效的算法来做到这一点,也许比天真的方法更好 啊好吧抱歉我误解了这个问题:) 只是为了理解您的问题:您对算法的输入是特定像素 A 和像素组,例如C, D, E,C, F, H, I,F, Q, R。输出应该是距离最小的组,其中距离定义为组中每个像素到特定像素A? 的曼哈顿距离之和 【参考方案1】:

更新

当问题提到Manhattan distances时,该解决方案的初稿计算几何(欧几里得)距离

这使得优化变得更简单。

    为每组像素选择一个像素作为主像素。不管是哪一个。

    对于组中的每个其他像素,计算其与主像素的偏移量(x 和 y)。与曼哈顿距离不同,保留此偏移的符号。

    将所有偏移量(x 和 y 偏移量)相加成一个数字,称为 total_offsets。

    当您需要与指定像素的距离时,请计算主像素的(曼哈顿)距离。将其乘以像素数并加上 total_offsets 以获得曼哈顿总距离。

步骤 1 - 3 每组只需执行一次,然后可以根据需要执行步骤 4。

例如

  Area A consists of 4 pixels: (8, 8), (8, 9), (9, 8) and (9, 9).  

  Declare (8, 9) as primary pixel.  Offsets are   
      (8, 9) --> (8, 8) = (0, -1)  
      (8, 9) --> (9, 8) = (1, -1)  
      (8, 9) --> (9, 9) = (1, 0)  
  total_offset = 0 + -1 + 1 + -1 + 1 + 0   
               = 0  
  num_pixels = 4  

To compute Manhattan distance from pixel (2, 4)

  distance to primary pixel  
  (2, 4) --> (8, 9) = (6, 5)   
                    = 11  
  dist * num_pixels + total_offsets = 11 * 4 + 0
                                    = 44

为了检查这一点,我们可以计算很长的路:

      (2, 4) --> (8, 8) = (6, 4)   
      (2, 4) --> (8, 9) = (6, 5)   
      (2, 4) --> (9, 8) = (7, 4)   
      (2, 4) --> (9, 9) = (7, 5)   

  distance = 6 + 4 + 6 + 5 + 7 + 4 + 7 + 5 
           = 44

【讨论】:

【参考方案2】:

听起来你已经知道如何计算距离了。

for 循环对你来说太慢了吗?你的循环会是 N^2 吗?

如果是这样,您可能会考虑使用BSP 或Quadtree。我看到的唯一麻烦是您正在尝试进行接近测试,而这些测试主要是为碰撞测试而设计的。它仍然可以让您更快地消除组集。

肯定会起作用的方法(尽管它在降低计算次数方面的有效性很大程度上取决于组的分布)是将世界简单地分割成一个均匀分布的、人口稀少的网格。如果一个组属于网格的多个部分,只需将其添加到两个网格条目中。当您运行比较时,您选择最近的网格条目,并且只在该网格条目中的组上运行您的点对组算法。

【讨论】:

【参考方案3】:

以下是一个简化的示例。您需要一个函数“int distance(Point p1, Point p2)”来计算距离(使用任何算法)。

Point pxTest = ... // the single pixel to use for distance checking
List<Point> pxGroup = ... // the group of pixels to check

Point pxMin = null; // the pixel with the minimum distance
int iMin = int.MAX; // the minimum distance so far

foreach(Point pxOther in pxGroup)
    if(iMin > distance(pxTest, pxOther))
    
        iMin = distance(pxTest, pxOther); // this could be cached in the line before as well to save this call
        pxMin = pxOther;
    

// now pxMin will include the closest point, iMin the distance

【讨论】:

以上是关于寻找像素和像素组之间最小距离的算法的主要内容,如果未能解决你的问题,请参考以下文章

如何通过计算像素来计算距离

OpenCV 距离变换中的像素索引

如何使用 Chrome 测量元素之间的像素距离?

使用图像计算到点之间的实际距离

深度图像上的表面法线

查找项目对之间的全局最小距离的算法