2010-03-01 56 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項目中使用模塊和函數庫中的函數。