2010-03-01 55 views
5

我有一大堆插图的图像,我想剪裁成较小的预览尺寸。什么是裁剪图像以避免空白区域或空白区域的好算法或库?

问题是我想裁剪它们以显示插图的“有趣”部分(即避免空白区域)。

图像通常具有平坦的颜色或背景的微妙渐变。它们大多是具有相当不同形状的矢量风格作品。

下面是一些例子:link ;-)

我一直在想使用某种图像特征检测算法与滑动窗口来找到的功能数量最多的区域。

我在PHP中实现这一点,但如果没有库或扩展可用,我并不介意自己实现它。

想法?

+0

这些专业的照片?如果是这样,检查三分法则,至少应该减少不同的领域'看'。 – 2010-03-01 00:42:23

+0

“空白”是真正的纯色,还是只有少量功能丰富的图像区域? – Matthew 2010-03-01 01:19:12

回答

1

那么,你可能想考虑只使用边缘检测算法。选取边数最多的区域。对不模糊的边缘赋予更高的权重(因为它们可能来自背景)。

1

ImageMagick for PHP已自动生成thumbnails。这个SO question有一个ImageMagick自动裁剪操作符的链接,我不确定,但我认为this是它的PHP接口。

the link

布尔Imagick :: trimImage(浮动 $起毛)
删除边缘是 从图像的背景颜色。

对于更一般的“兴趣”,也许尝试一个seam carving(找到最高能量,而不是最低能量区域)的倒数。

1

好了,这里就是我会做了,看着例子后:

总和所有行和每幅图像中的所有列。你会得到两个数组,这两个看起来像这样:

 /-----\ /--\ 
    _/  -- | 
___-    \_________ 

通过查看这些阵列的一些图片,找到一个合适的阈值(可能是一些略高于零)。然后,这个阈值的最左边和最右边的交叉点就是你必须裁剪的地方。我希望我已经设法说清楚了,如果不是的话 - 问!使用http://pecl.php.net/package/imagick

+1

不要对行和列求和,求和一行/列与下一行之间的*差*。 – 2010-06-21 22:29:48

1

一个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]); 
?> 

它应该足够好,只要图像没有围绕其边界的框架。

1

这里是一个fairly simple approach使用边缘检测过滤器,然后裁剪图像的边缘中心生成缩略图。它在大多数图像上都能很好地工作,但如果有多个主题则不会。对于在源图像中识别“有趣”点的其他方式,我愿意提供建议。

1

Drupal有一个名为smartcrop的项目,该项目有PHP代码来查找图像中最高熵和“有趣”的区域。请参阅output examples

您应该能够在非Drupal项目中使用模块和函数库中的函数。