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

3
我们正在尝试对图片进行裁剪,使其具有1:1的正方形比例,类似于Facebook创建缩略图时的处理方式。
在我们的情况下,如果裁剪后的图片保持与原始图片相同的高度(或者在图像方向是纵向时保持相同的宽度),或者自动调整大小也没关系。
我考虑使用算法来比较对象与背景、焦点或类似热图的颜色和/或区域等方法,以找到最相关的部分。类似于面部检测,可能会有几种想法/方法来寻找要使用的主要图片部分。
我们正在寻找基于Java(Android)的解决方案或任何可以用于Java / Android的内容。如有任何帮助或想法,将不胜感激!谢谢!
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。还要注意,取决于初始图像的大小,裁剪其一小块可能不会得到任何相关内容。在这些情况下,更有趣的是首先调整图像大小,然后应用相关方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接