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

Jea*_*son 6 python r roi image-processing

我有一个大图像,其中包含对背景感兴趣的"斑点".我有所有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

如果斑点相对较小(如图所示),您可以使用斑点中心 x,y 对运行 k 均值聚类。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/frame-area 比率对簇进行排序,并对它们进行求和,例如,直到覆盖(完成)足够的 blob,或者您的总面积变得太大(在这种情况下,使用更大的 k 重新运行)。