3

我们正在尝试以方形纵横比 (1:1) 裁剪图像(照片)的相关区域,类似于 Facebook 在创建缩略图时所做的。

在我们的例子中,裁剪是否具有要处理的图像的原始高度(或当图像方向为纵向 h>w 时的宽度)或者自动裁剪是否也在调整自身大小并不重要

我正在考虑算法,例如将对象与背景或焦点或热图之类的东西进行比较,结合颜色和/或区域以找到最相关的部分。可能有几种想法/方法来找到要使用的图像的主要部分,类似于人脸检测。

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

4

1 回答 1

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]}]]

在此处输入图像描述

将关键点形成的凸包剥离一次后,根据剩余点的边界矩形对图像进行裁剪:

在此处输入图像描述

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

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

于 2013-01-13T23:29:04.890 回答