2015-12-10 68 views
2

這是一個二進制圖像的例子,即作爲輸入,我們有一個imageByteArray和2個可能的值:0255如何減少二進制圖像中的背景噪音

例1:enter image description here

例2:enter image description here

該圖像包含在背景一些原稿邊緣。

該任務是刪除,減少背景像素的數量對邊緣像素的影響最小

問題是現代算法存在哪些技術來做到這一點?

我不希望作爲一個答案是什麼:使用高斯模糊擺脫背景噪音,使用黑白算法(康力,索貝爾等)閾值或使用霍夫(霍夫線性的推移這種噪聲瘋狂不管是什麼選項已設置)

最簡單的解決方案是檢測所有輪廓並過濾掉長度最小的輪廓。這樣做效果很好,但有時根據圖像它也會擦除有用的邊緣像素。

更新: 作爲輸入,我有標準的RGB圖像與文件(駕駛執照ID,支票,賬單,信用卡,...)在一些背景。主要任務是檢測文檔邊緣。接下來的步驟是衆所周知的:灰度,模糊,Sobel二值化,Hough概率,找到矩形或梯形(如果找到梯形形狀然後進行透視變換)。在簡單的對比背景下,它一切正常。我之所以會問降噪問題,是因爲我需要處理數千種背景,而且無論使用什麼選項,都會產生噪音。不管Hough如何配置,噪聲都會導致額外的線路,並且額外的線路可能欺騙後續邏輯並嚴重影響性能。 (它在java腳本中實現,沒有OpenCV或GPU支持)。

+1

這是您的輸入圖像的黑/白圖像?如果是這樣,很難提高圖像的質量 –

+0

你可以研究形態學操作,雖然也許已經有太多的噪音來做任何形態學上合理的事情。 – hbaderts

+0

作爲輸入我有標準的RGB圖像,上面的圖像是灰度,模糊和索貝爾處理的結果。 –

回答

0

我認爲你做了平均二進制圖像,而不是雙調...

基於待辦事項洪水填充細分

  1. 爲組像素掃描圖像color=255
  2. 爲每組像素創建其區域的蒙版/地圖

    只需用4或8個鄰居連接填充設置像素,然後計算您填充的像素數。

  3. 每個填充區域計算其邊界框

  4. 檢測邊緣線

    • 邊緣線具有矩形邊界框,以便測試其縱橫比如果接近方形,那麼這是不邊緣線
    • 也太小邊界框表示不是邊緣線
    • 太小填充編輯像素的比較計數到邊框大邊尺寸則面積也不是一個邊緣線
    • 你可以讓這個更強大的,如果你退步線爲每個區域的像素集合並計算迴歸線和各組像素之間的平均距離。如果過高的區域未邊緣線...
  5. 重新着色的非邊緣線的區域爲黑色

    所以無論是從。減去圖像或洪水的面具與黑色再補......

[註釋]

有時步驟#5可以弄亂文檔的內部。在這種情況下,您不會重新着色任何東西,而是記住所有邊緣區域的迴歸線。然後在整個過程完成後,將所有平行且接近同一軸線(無限長線)的線連接起來,以減少到確定文件長方形的四條大線。所以,現在用黑色以外的所有像素(由幾何方法)

0

對於這樣的任務,你通常會仔細檢查輸入數據,並試圖找出線索,你可以利用什麼補。但不幸的是,你只提供了一個例子,這使得這種方法非常無用。此外,這種表示方式並不舒服 - 您是否已經完成了一些預處理,或者您可以將其作爲輸入?在第一種情況下,如果您能向我們展示真正的投入,您可能會得到更好的建議

接下來,如果你的目標是降低噪音,而不是文件/背景分割 - 你真的在選項的限制。與您所說的類似,我會嘗試檢測具有255強度的連接組件(而不是檢測輪廓,這可能不夠健壯),並刪除小面積的組件。這在某些情況下可能會失敗。

此外,在圖像您提供您可以使用本地統計壓制規則干擾的區域。如果您適當選擇鄰域大小,這將減少背景混亂。

但同樣,如果你的文件檢測這樣 - 有可能是更穩健的做法。例如,如果您知道前景對象(駕駛員ID) - 您可以嘗試收集ID圖像的數據集,並計算「典型」顏色直方圖 - 它可能更具特色。之後,您可以在輸入圖像上反向投影該直方圖,並獲得感興趣的粗糙區域,或者甚至精確的掩模。然後你可以對它進行二值化並嘗試檢測輪廓。您可以嘗試不同的色彩空間和容器大小,以查看哪種最適合。

如果您必須在不同的照明條件下工作,您可以嘗試均衡直方圖或進行其他預處理以減少由照明引起的顏色變化。

+0

我應該在問題中寫下更多的上下文,我的錯誤。 作爲輸入我有標準的RGB圖像與文件(例如驅動程序許可證ID)在一些背景。主要任務是檢測文檔邊緣。接下來的步驟是衆所周知的:灰度,模糊,Sobel二值化,Hough概率,找到矩形或梯形(如果找到梯形形狀然後進行透視變換)。在簡單的對比背景下,它一切正常。我之所以會問降噪問題,是因爲我需要處理數千種背景,而且無論使用什麼選項,都會產生噪音。 –

+0

無論Hough如何配置,附加線路可能會欺騙後續邏輯並嚴重影響性能,噪音會導致額外的線路。 (它在java腳本中實現,沒有OpenCV或GPU支持)。如果我錯過了水平,並且你知道更有效和強大的方法不受背景影響,請讓我知道。 –

+0

編輯答案 – alexisrozhkov

0

嚴格回答的問題的二值圖像(即傷害爲已經取得後):

什麼似乎相對於噪聲的邊緣像素的特性是,它們形成(相對)長和光滑鏈。

到目前爲止,我並沒有比跟蹤8連接像素的所有鏈條更好的方法,例如使用輪廓跟隨算法,並檢測直線部分,例如通過Douglas-Peucker簡化。

由於噪音只在卡的外側,斑點輪廓至少會有一個「乾淨」部分。保持足夠長的部分。

這可能會破壞彎曲的拐角,實際上您應該尋找足夠長的「平滑」路徑。

不幸的是,我不能建議任何具體的算法來解決這個問題。它應該基於圖形分析與幾何結合(枚舉圖中的長路徑並檢查局部/全局曲率)。

據我所知(在閱讀數千篇相關文章後),這在文獻中沒有涉及到。

1

很難知道這種做法是否會與所有的圖像工作,因爲你只提供一個,但霍夫線路檢測與ImageMagick的,並在終端命令行這些參數會產生這樣的:

convert card.jpg            \ 
    \(+clone -background none -fill red -stroke red   \ 
     -strokewidth 2 -hough-lines 49x49+100 -write lines.mvg \ 
    \) -composite hough.png 

enter image description here

和文件lines.mvg包含4行如下:

# Hough line transform: 49x49+100 
viewbox 0 0 1024 765 
line 168.14,0 141.425,765 # 215 
line 0,155.493 1024,191.252 # 226 
line 0,653.606 1024,671.48 # 266 
line 940.741,0 927.388,765 # 158 

ImageMagick的是安裝編輯大多數Linux發行版,並可用於OSX和Windows從here

+0

是的,您是對的,對於某個圖像,幾乎總是可以設置Hough參數來查找邊緣線。但是,在一種情況下,最佳參數(案例=背景,文檔類型,位置,方向,光線條件,角度等)可能不會在另一行中提供必要的行或額外的行。 所以有兩種選擇: 根據輸入圖像動態設置Hough參數(這非常困難並且經驗豐富)。 設置靜態霍夫參數適用於大多數情況,對於困難的背景,在使用霍夫之前先進行降噪處理。 –

0

以前的答案都不會真的起作用,唯一可以在這裏工作的是blob過濾器,對它進行過濾,以便將特定大小以下的blob刪除。

相關問題