自动查找和裁剪相关图像区域

时间:2013-01-13 19:13:24

标签: java android image-processing crop feature-detection

我们正在尝试使用方形宽高比(1:1)裁剪图像(照片)的相关区域,类似于Facebook在创建缩略图时的操作。

在我们的情况下,如果裁剪具有要处理的图像的原始高度(或图像方向为纵向h> w时的宽度)或者自动裁剪也自行调整大小,则无关紧要< / p>

我正在考虑比较具有背景或焦点的对象或类似热图的算法,组合颜色和/或区域以找到最相关的部分。可能有几种想法/方法可以找到要使用的图像的主要部分,类似于面部检测。

我们正在寻找基于Java(Android)的解决方案或任何可以用于Java / Android的解决方案。任何帮助或想法将不胜感激!谢谢!

1 个答案:

答案 0 :(得分:3)

我会分两步完成,其中初始步骤更稳健,第二步可以基于例如熵。对于第一步,您可以使用现在比较常见的SURF,我希望能找到它的Java实现。 SURF将给出一组它认为对描述图像很重要的关键点。考虑到图像中这些关键点的位置,您有一组(x, y)坐标,您可以使用这些坐标将初始图像的区域缩小到包含这组点的区域。现在,由于这些关键点可能位于图像中的任何位置,因此您可能希望丢弃其中的一些关键点(即那些与其他关键点相距太远的异常值)。这个丢弃步骤的一个非常简单的方法是考虑从最初的一组关键点开始的凸包,从那里,你可以多次剥离这个船体。每次你“剥离”它,你实际上都会丢弃当前凸包中的点。

以下是第一步的示例:

f = Import["http://fohn.net/duck-pictures-facts/mallard-duck.jpg"];
kp = ImageKeypoints[f, MaxFeatures -> 200];
Show[f, Graphics[{PointSize[Medium], Red, Point[kp]}]]

enter image description here

剥离一次由关键点形成的凸包并根据剩余点的边界矩形修剪图像:

enter image description here

从上图中,您可以根据其他方法决定选择哪个子区域。一个显然很常见的是Reddit使用的那个,它连续地从图像中去除较小的熵。快速搜索它,我在https://github.com/christopherhan/pycrop/blob/master/pycrop.py#L33找到了一个这样的实现,它非常简单。

您可能想尝试的另一种不同类型的方法称为Seam-Carving。另请注意,根据初始图像的大小,裁剪一小部分图像不太可能产生任何相关性。在这些情况下,首先调整图像大小然后应用相关方法会更有趣。