2013-01-13 59 views
3

我們正在嘗試以正方形寬高比(1:1)裁剪圖像(照片)的相關區域,類似於Facebook在創建縮略圖時的操作。自動查找和裁剪相關圖像區域

在我們的案例中,裁剪是否具有待處理圖像的原始高度(或圖像方向爲人像h> w時的寬度)或自動裁剪正在調整大小本身並不重要

我喜歡與背景對比對象或聚焦或像熱圖的東西,結合顏色和/或地區,找到最相關的部分思想的算法。可以有幾個想法/方法來找到要使用的圖像的主要部分,類似於人臉檢測。

我們正在尋找基於Java(Android)的解決方案或任何可以用於Java/Android的解決方案。任何幫助或想法將不勝感激!謝謝!

回答

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]}]] 

enter image description here

剝離一旦由關鍵點所形成的凸包和修剪根據剩餘點的邊界矩形的圖像後:

enter image description here

從上面的圖片,你可以決定它的哪個子區域根據其他方法選擇。一種顯然很常見的是Reddit使用的一種,它連續從圖像中移除較小的熵片。快速搜索它,我發現一個這樣的實現在https://github.com/christopherhan/pycrop/blob/master/pycrop.py#L33,這是非常簡單的。

另一種不同類型的方法,你可能會想嘗試被稱爲Seam-Carving。還要注意的是取決於有多大的初始圖像,這是不可能的裁剪一小塊的,它會給任何相關信息。在這些情況下,首先調整圖像大小並應用相關方法會更有趣。