我将分两步执行此操作,其中初始步骤更稳健,第二步可以基于例如熵。第一步,你可以使用现在比较常见的 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。另请注意,根据初始图像的大小,裁剪一小部分不太可能提供任何相关信息。在这些情况下,首先调整图像大小然后应用相关方法会更有趣。