2011-02-07 155 views
2

我正在尋找裁剪上傳圖像的方法。我花了很多時間在網站上搜索,並找到很多好的解決方案,如果用戶提供了要裁剪的尺寸/位置。自動裁剪圖像(自動識別圖像與背景)

我的照片大部分都是在較暗的背景下拍攝的。考慮拍照手機拍攝的駕駛執照,信用卡,票據存根與較暗(但不標準)的背景。我正在尋找一種方法,在上傳之前或之後讓我的代碼識別應該裁剪的內容。

在一個完美的世界中,一些聰明的人會提出一個建議,告訴他應該裁剪什麼,並給用戶一個機會來給它一個最終的好處。這將允許不太完美的裁剪算法。

細算起來「微調」,而不是基於它好像我能可能的ImageMagick的imagemagick.org/script/api.php

ImageMagick的做到這一點的第一個答案作物似乎有intefaces在PHP &紅寶石。它支持修剪「模糊」圖像,其中邊界不一致。我正在尋找建議的問題是一個圖形引擎的建議,它具有良好的邏輯來查找圖像的邊緣。有沒有更好的引擎,我應該看imagemagick?

+0

如果有一種方法可以讓頁面上沒有出現統一的顏色背景,您可以很容易地選擇背景像素並使用它們來定位裁剪邊界。 – Benjamin

+0

您選擇的「引擎」取決於您的目標語言。你在用什麼? – misha

回答

1

認識到,在每個像素的基礎上,您要裁剪的背景不一致。細微(有時小於微妙)變化存在,您需要考慮使用公差

如果您熟悉Adobe Photoshop,有一個功能可完全執行您提出的操作(圖像 - >修剪)。它通過查看用戶選定的角落像素(左上角,右上角等),然後確定最偏離的像素,即而不是那種顏色。

在編程時,你需要的像素遍歷圖像中確定爲所選擇的顏色的最上面和最下面的像素的Y座標,在最左邊和最右邊的X座標。那些座標就決定了裁切尺寸。

當決定一個像素是否爲所選顏色時,可以通過允許百分比差異進行分解來引入容差。換句話說,如果背景不是一致的白色(RGB 255,255,255),您可能需要考慮一些變化。

您沒有提及編程語言,因此您需要研究可能需要利用的圖形庫和函數。

+0

這是有幫助的...我的第一個問題是我在考慮裁剪而不是裁剪..看起來我可以用http://www.imagemagick.org/script/api.php – Rich

3

看看下面的結果是否令人滿意。我在Mathematica中實現了一個小程序來完成它。如果您喜歡這些結果,我可以進一步解釋這些算法,或者您可以自己檢查Mathematica幫助文件。

我們從這些圖片:

enter image description hereenter image description here

,並確定了以下功能:

f[image_] := 
[email protected] 
    ImageMultiply[image, 
    [email protected] 
    Erosion[Dilation[ 
     DeleteSmallComponents[[email protected]@image, 10000], 3], 
     3]] // ImageAdjust 

而且結果是:

enter image description hereenter image description here

HTH!

+0

這樣做這些結果是相當令人印象深刻的。你介意更詳細地解釋一下嗎?我想實現類似的東西 - 儘管可能使用[PIL](http://www.pythonware.com/products/pil/)而不是Mathematica。 – bjmc

+0

@bjmc:只使用PIL會使你的任務變得困難,考慮至少使用opencv來進行scipy。這個Mathematica代碼中的所有步驟都很簡單,'Binarize'使用otsu閾值,'DeleteSmallComponents'可以使用'scipy.ndimage.label'複製,腐蝕和膨脹是隨時可用的。但是,這些代碼因爲沒有如此不同的圖像而失敗。考慮圖片http://i.stack.imgur.com/SvoQe.jpg,結果與這個確切的代碼:http://i.imgur.com/xyVtj.jpg。檢查http://stackoverflow.com/questions/14224995/remove-background-color-or-texture-before-ocr-processing/14227096#14227096。 – mmgp

0

可能有用的一個短語是「顯着性」 - 識別圖像的「有趣」區域。一個開始研究這個問題的地方是Microsoft Research - 你可以用「有趣的部分」概述圖像的例子。這是否達到您的要求?