2010-12-10 61 views
1

如果我有一個圖像,讓我們說方塊。是否有可能去除由10個(非白色)像素或更少形成的所有形狀,並保留由11個像素或更多像素形成的所有形狀?我想以編程方式或通過命令行來執行此操作。從X像素或更少的像素中刪除圖像的形狀

在此先感謝!

回答

2

有幾種方法可以解決這個問題。你所說的通常稱爲文件成像應用程序中的去斑。文檔掃描儀在掃描過程中經常會在圖像中引入大量灰塵和噪音,因此必須將其刪除以幫助提高OCR的準確性。

我假設您在這裏處理黑白圖像,或者可以將圖像轉換爲黑白圖像,否則它會變得複雜得多。去斑點是通過分析頁面上的所有斑點來完成的。另一種決定斑點大小的方法是決定寬度,高度和像素數量的組合。

Leptonica.com - 是一個基於開放源碼C的庫,具有您需要的blob分析功能。通過一些簡單的檢查和循環,您可以刪除這些較小的對象。 Leptonica也可以很容易地編譯成命令行程序。有很多示例程序,這是學習Leptionica的最佳方式。

對於測試,您可能要嘗試ImageMagick。它有一個despeckle命令行選項,但沒有其他參數。 http://www.imagemagick.org/script/command-line-options.php#despeckle

另一種選擇是在Google中尋找「去斑」算法。

3

查找洪水填充算法並改變它們來計算像素而不是填充。然後如果形狀足夠小,請用白色填充。

0

您需要連接組件標籤算法。它將掃描圖像併爲每個連接的形狀提供一個id號,併爲每個像素分配一個它所屬形狀的id號。

運行連接組件過濾器後,只計算分配給每個對象的像素,找到具有少於10個像素的對象,並用白色替換這些對象中的像素。

3

可能一種稱爲侵蝕的算法可能是有用的。它適用於布爾圖像,縮小「true」的所有區域,去除其表面像素的一層。適用幾次,小面積消失,大面積剩餘(雖然縮小)。用相反的算法縮小倖存者,擴張(對圖像的邏輯補充施加侵蝕)。通過測試一個像素是否位於「對象」中,然後定義它,找到一種方法來定義布爾圖像,並找到一種方法將結果應用於原始圖像,以將不需要的小對象更改爲背景顏色。

更具體的將需要看到的例子。

+0

侵蝕 - >膨脹週期是否無損? – 2010-12-13 19:43:14

0

你只是想弄清楚每個組件的面積。所以一個8方向的跟蹤算法可以提供幫助。我有一個API解決了用C++編寫的這個問題。如果你想,給我發一封電子郵件。

1

如果你可以使用openCV,這段代碼做你想要的(即despakle)。您可以在第一行播放大小(3,3)的參數,以擺脫更大或更小的噪音僞影。

Mat element = getStructuringElement(MORPH_ELLIPSE, Size(3,3)); 
morphologyEx(image, image, MORPH_OPEN, element); 
morphologyEx(image, image, MORPH_CLOSE, element); 
0

ImageMagick,從版本6.8開始。9-10,包括一個-connected-components選項,可以用來做你想做的事情,但是從官方網站提供的example,如何真正獲得原始圖像減去刪除的連接組件並不明顯。

我幾乎可以肯定有一個簡單的方法,但我做到了通過笨重的腳本執行一系列步驟:

  • 首先,我從所連接的部件例如運行命令:

    convert in.png \ 
        -define connected-components:verbose=true \ 
        -connected-components 8 out.png 
    
  • 這產生以下格式輸出:

    Objects (id: bounding-box centroid area mean-color): 
    (...) 
    181: 9x9+1601+916 1605.2,920.2 44 gray(0) 
    185: 5x5+1266+923 1268.0,925.0 13 gray(0) 
    274: 5x5+2276+1661 2278.0,1663.0 13 gray(255) 
    
  • 然後,我使用awk僅過濾包含黑色分量(在圖像中的平均顏色爲gray(0))的區域(以像素爲單位)的行小於我的閾值$ min_cc_area。請注意,connected-components可以選擇過濾小於給定區域的組件,但我需要相反的選項。在AWK線是類似於以下:

    {if ($4 < $min_cc_area && $5=="gray(0)") { print $2 }} 
    
  • 我隨後就創建一個命令行爲的ImageMagick其中I畫了這些連接部件的頂部白色矩形。該-draw命令期望形式x1,y1 x2,y2座標,所以我AWK再次用來計算從那些座標由-connected-components提供的格式[w]x[h]+x1+y1

    awk '{print "white fill rectangle " $3 "," $4 " " $3+$1-1 "," $4+$2-1 }' 
    
  • 最後,我跑了創建ImageMagick的命令行來創建一張新圖像,將原始圖像頂部的所有白色矩形組合在一起。

最終,我得到了下面的腳本:

# usage: $0 infile min_cc_area outfile 
infile=$1 
min_cc_area=$2 
outfile=$3 
awk_exp="{if (\$4 < $min_cc_area && \$5==\"gray(0)\") { print \$2 }}" 

draw_rects="" 
draw_rects+=$(convert $infile -define connected-components:verbose=true \ 
    -connected-components 8 null: | \ 
    awk "$awk_exp" | tr 'x+' ' ' | \ 
    awk '{print " rectangle " $3 "," $4 " " $3+$1-1 "," $4+$2-1 }') 

convert $infile -draw "fill white $draw_rects" $outfile 

注意,該解決方案可以消除接近黑色像素去除CC的,如果他們insersect已刪除組件的邊框。