如果我有一個圖像,讓我們說方塊。是否有可能去除由10個(非白色)像素或更少形成的所有形狀,並保留由11個像素或更多像素形成的所有形狀?我想以編程方式或通過命令行來執行此操作。從X像素或更少的像素中刪除圖像的形狀
在此先感謝!
如果我有一個圖像,讓我們說方塊。是否有可能去除由10個(非白色)像素或更少形成的所有形狀,並保留由11個像素或更多像素形成的所有形狀?我想以編程方式或通過命令行來執行此操作。從X像素或更少的像素中刪除圖像的形狀
在此先感謝!
有幾種方法可以解決這個問題。你所說的通常稱爲文件成像應用程序中的去斑。文檔掃描儀在掃描過程中經常會在圖像中引入大量灰塵和噪音,因此必須將其刪除以幫助提高OCR的準確性。
我假設您在這裏處理黑白圖像,或者可以將圖像轉換爲黑白圖像,否則它會變得複雜得多。去斑點是通過分析頁面上的所有斑點來完成的。另一種決定斑點大小的方法是決定寬度,高度和像素數量的組合。
Leptonica.com - 是一個基於開放源碼C的庫,具有您需要的blob分析功能。通過一些簡單的檢查和循環,您可以刪除這些較小的對象。 Leptonica也可以很容易地編譯成命令行程序。有很多示例程序,這是學習Leptionica的最佳方式。
對於測試,您可能要嘗試ImageMagick。它有一個despeckle命令行選項,但沒有其他參數。 http://www.imagemagick.org/script/command-line-options.php#despeckle
另一種選擇是在Google中尋找「去斑」算法。
查找洪水填充算法並改變它們來計算像素而不是填充。然後如果形狀足夠小,請用白色填充。
您需要連接組件標籤算法。它將掃描圖像併爲每個連接的形狀提供一個id號,併爲每個像素分配一個它所屬形狀的id號。
運行連接組件過濾器後,只計算分配給每個對象的像素,找到具有少於10個像素的對象,並用白色替換這些對象中的像素。
可能一種稱爲侵蝕的算法可能是有用的。它適用於布爾圖像,縮小「true」的所有區域,去除其表面像素的一層。適用幾次,小面積消失,大面積剩餘(雖然縮小)。用相反的算法縮小倖存者,擴張(對圖像的邏輯補充施加侵蝕)。通過測試一個像素是否位於「對象」中,然後定義它,找到一種方法來定義布爾圖像,並找到一種方法將結果應用於原始圖像,以將不需要的小對象更改爲背景顏色。
更具體的將需要看到的例子。
你只是想弄清楚每個組件的面積。所以一個8方向的跟蹤算法可以提供幫助。我有一個API解決了用C++編寫的這個問題。如果你想,給我發一封電子郵件。
如果你可以使用openCV,這段代碼做你想要的(即despakle)。您可以在第一行播放大小(3,3)的參數,以擺脫更大或更小的噪音僞影。
Mat element = getStructuringElement(MORPH_ELLIPSE, Size(3,3));
morphologyEx(image, image, MORPH_OPEN, element);
morphologyEx(image, image, MORPH_CLOSE, element);
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已刪除組件的邊框。
侵蝕 - >膨脹週期是否無損? – 2010-12-13 19:43:14