我有一大堆插图图像,我想将它们裁剪为更小的预览尺寸。
问题是我想裁剪它们以显示插图的“有趣”部分(即避免空白区域)。
图像通常具有平坦的颜色或背景的微妙渐变。它们大多是具有相当不同形状的矢量风格的艺术品。
以下是一些示例:链接;-)
我一直在考虑使用某种带有滑动窗口的图像特征检测算法来找到具有最多特征的区域。
我在 PHP 中实现它,但如果没有可用的库或扩展,我不介意自己实现它。
想法?
我有一大堆插图图像,我想将它们裁剪为更小的预览尺寸。
问题是我想裁剪它们以显示插图的“有趣”部分(即避免空白区域)。
图像通常具有平坦的颜色或背景的微妙渐变。它们大多是具有相当不同形状的矢量风格的艺术品。
以下是一些示例:链接;-)
我一直在考虑使用某种带有滑动窗口的图像特征检测算法来找到具有最多特征的区域。
我在 PHP 中实现它,但如果没有可用的库或扩展,我不介意自己实现它。
想法?
ImageMagick有一个修剪操作。它可以作为一个库使用,但我不知道从 PHP 中使用它有多难。有一些PHP 接口。
好的,在查看示例之后,这就是我要做的:
对每个图像的所有行和所有列求和。你会得到两个数组,看起来像这样:
/-----\ /--\
_/ -- |
___- \_________
通过查看这些数组中的一些图像,找到一个合适的阈值(可能略高于零)。然后这个阈值的最左边和最右边的交叉点就是你必须裁剪的地方。我希望我已经设法说得足够清楚了,如果不是——请问!
这是一种相当简单的方法,使用边缘检测过滤器,然后围绕图像的边缘中心进行裁剪以生成缩略图。它适用于大多数图像,但如果有多个主题,则效果不佳。我愿意接受有关识别源图像中“有趣”点的其他方法的建议。
ImageMagick for PHP自动生成缩略图。这个SO question有一个指向 ImageMagick 自动裁剪运算符的链接,我不确定,但我认为这是它的 PHP 接口。
从链接:
bool Imagick::trimImage (float $fuzz)
从图像中删除作为背景颜色的边缘。
对于更一般的“有趣”,也许可以尝试缝雕刻的逆(寻找最高能量,而不是最低能量区域)。
好吧,您可能只想考虑使用边缘检测算法。选择边数最多的区域。对不模糊的边缘赋予更高的权重(因为它们可能来自背景)。
使用http://pecl.php.net/package/imagick的 CLI 程序:
<?php
dl('imagick.so');
$img = new Imagick();
$img->readImage($argv[1]);
# (* 0.0: exact match; * 1.0: crop entire image)
$fuzz = current($img->getQuantumRange()) * 0.25;
$img->trimImage($fuzz);
$img->writeImage($argv[2]);
?>
只要图像的边框周围没有框架,它就应该足够好。