用于最佳放置裁剪区域以捕获图像中的特征(斑点)的算法

时间:2015-04-21 15:25:33

标签: python r image-processing roi

我有一个大图像,其中包含背景下感兴趣的“斑点”。我有所有blob的位置(质心,边界框,区域)。我想在图像中裁剪有限数量的固定大小的区域,这些区域允许我捕获大部分斑点。以下示例显示同一图像中的1,2或3个裁剪区域。

此示例显示裁剪1区域(红色)相对容易:只选择具有尽可能多的blob的区域。这可以通过尝试所有事情或者可能通过使用核密度估计器或类似事件计算blob密度来解决。

但裁剪2个区域(蓝色虚线)不仅仅是在上面第一个选择之后裁剪下一个最好的作物。这是一个新问题,我需要找到2种作物的最佳组合。尝试2种作物(蛮力)的所有组合可能变得太计算成本(我有很多图像要处理,它们很大)。

同样,裁剪3个区域(绿色)是一个新问题,而蛮力甚至更不适合。在该特定示例中,3个区域中的2个与蓝色情况相同并且添加了新的情况,但这不是一般情况(我只是想显示稍微复杂的情况)。

我不知道解决n作物案例的算法。我想知道是否有一个理论/众所周知的解决方案来解决这个问题。

另外:

  • 问题的几何形状大致与上述例子的几何形状相同(图像高度上最多两个作物,宽度上多个作物);在简化事情的情况下
  • 庄稼不应该相交
  • blob应尽可能在作物中居中(即https://dl.dropboxusercontent.com/u/1047321/SO_crop/cutout_one_blob.png
  • 作物应保持在原始图像边界内(参见上面的例子)
  • 应该考虑斑点的面积(我对大斑点比对小斑块更感兴趣);但是,可以通过将权重与每个blob相关联来计算每个裁剪布局的分数,从而在任何算法中引入。
  • 可以留下一些斑点。实际上,我可能会计算一个成本复杂性参数,例如添加作物的新blob数量,并设置一个阈值,在此阈值下我停止添加作物。

提前感谢任何指针。

PS:编码语言在这里并不重要,因为算法的核心(根据斑点的位置/大小找到作物的最佳位置)只需要小数组(每个图像的位置/大小约为100个斑点)要计算。我可能会使用Python或R.

1 个答案:

答案 0 :(得分:1)

如果斑点相对较小,如图中所示,则可以使用斑点中心x,y对运行k-Means聚类。 python scikit-learn包非常成熟,应该运行良好:http://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html(Kmeans分类器的函数fit_predict)

k是一个输入,表示您想要的簇数。 该算法将blob(样本)分成k个簇(集合)。 然后,您可以计算每组的x,y帧(min-x,max-x,min-y,max-y),并且还包括单个大小的blob,或者如果它们相当小,则只取最大值。

然后,您可以按照#blobs / frame-area ratio对群集进行排序,并将它们相加,例如直到覆盖(完成)足够的斑点 - 或者你的总面积变得太大(在这种情况下重新运行更大的k)。