2015-09-01 98 views
0

的邊緣,我需要找到邊緣,併產生類似下面的黑白圖像的點: Example scenario查找黑白圖像

我不知道如何去這樣做。我知道OpenCV是一種選擇,但這對於確定是一件簡單的事情來說是過度的。有誰知道任何簡單的方法來做到這一點?圖書館是好的,只要他們不是太重量級(只有頭部首選)

+0

downvote的任何理由? –

回答

3

我會使用Canny邊緣檢測,儘管您可以輕鬆實驗@therainmaker建議的其他人。我會使用免費的ImageMagick,並安裝在大多數Linux發行版上,也可用於OS X和Windows。

在命令行中,你可以使用這個:

convert blob.png -canny 0x1+10%+30% result.png 

enter image description here

或本:

convert blob.png -canny 0x1+10%+30% -negate result.png 

enter image description here

用C使用++,你可以使用Magick++ ,其被描述爲here。有一個合理的教程here

如果您想了解使用的理論和實例(包括Sobel等)的描述,請參閱Anthony Thyssen的優秀網頁here

根據你實際在做什麼,你可能會更好地使用形態學技術(形狀檢測)而不是邊緣檢測技術。如果是這樣,ImageMagick也可以爲你做到這一點。例如:

convert blob.png -morphology EdgeIn Octagon edgein.png 

enter image description here

該技術是很好here說明。

convert blob.png -canny 0x1+10%+30% -negate pbm:- | potrace -s -o result.svg 

這會給你這樣一個漂亮的光滑的矢量路徑:

如果,你想要的輪廓爲矢量路徑,你可以通過一箇中間PBM文件中像這樣結合ImageMagickpotrace

<?xml version="1.0" standalone="no"?> 
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN" 
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd"> 
<svg version="1.0" xmlns="http://www.w3.org/2000/svg" 
width="745.000000pt" height="1053.000000pt" viewBox="0 0 745.000000 1053.000000" 
preserveAspectRatio="xMidYMid meet"> 
<metadata> 
Created by potrace 1.12, written by Peter Selinger 2001-2015 
</metadata> 
<g transform="translate(0.000000,1053.000000) scale(0.100000,-0.100000)" 
fill="#000000" stroke="none"> 
<path d="M6145 8276 c-159 -39 -545 -231 -975 -485 -276 -163 -313 -179 -630 
-267 -567 -157 -1108 -385 -1550 -652 -182 -111 -178 -107 -359 -289 -173 
-174 -351 -387 -483 -579 -42 -61 -84 -116 -92 -123 -8 -7 -18 -25 -21 -41 -3 
-16 -13 -34 -21 -41 -8 -7 -27 -33 -41 -58 -14 -25 -41 -68 -58 -96 -18 -27 
-48 -81 -66 -120 -18 -38 -44 -83 -57 -100 -38 -46 -183 -353 -246 -516 -142 
-373 -156 -550 -76 -979 76 -403 215 -867 299 -999 40 -62 121 -138 167 -157 
58 -24 119 -32 179 -22 74 11 276 94 775 316 423 188 561 243 900 362 568 199 
1059 434 1478 706 261 170 403 298 552 496 261 346 439 756 494 1138 38 261 
72 696 81 1025 8 272 17 342 72 554 85 332 112 563 79 691 -49 188 -210 283 
-401 236z m221 -27 c64 -30 115 -84 150 -155 28 -57 29 -64 28 -199 0 -165 
-16 -262 -84 -531 -59 -229 -67 -295 -75 -569 -13 -471 -64 -995 -120 -1230 
-86 -363 -361 -858 -621 -1119 -229 -229 -721 -529 -1279 -778 -220 -99 -319 
-138 -615 -242 -340 -120 -556 -208 -1001 -406 -581 -260 -633 -278 -736 -259 
-103 20 -207 116 -273 253 -106 221 -260 821 -301 1176 -35 311 33 578 273 
1062 37 75 78 149 91 165 12 15 38 60 56 98 18 39 48 93 66 120 17 28 44 71 
58 96 14 25 33 51 41 58 8 7 18 25 21 41 3 16 13 34 21 41 8 7 50 62 92 123 
207 300 562 688 732 801 45 30 85 55 88 55 3 0 37 20 76 44 375 232 967 478 
1521 631 268 74 353 108 535 216 333 197 793 440 927 491 143 54 243 59 329 
17z"/> 
</g> 
</svg> 
+0

謝謝你的形狀檢測選項。看起來這是我真正需要的,因爲我只會傳遞黑白圖像,而這些圖像將會集中在一塊。 –

1

您正在尋找的是邊緣檢測。如果圖像如上所述是乾淨的,則邊緣檢測的結果將是完美的,並且在其之後不需要其他處理。

那麼我們如何做邊緣檢測?我假設你知道圖像在計算機中存儲爲具有強度值的2D矩陣。因此,如果您在圖像上應用了一個遮罩,即採用一個小矩陣,在圖像的不同點處計算其值,並將計算結果替換爲矩陣中心的值,則可以執行邊緣檢測。

有很多用於此目的的口罩。我建議你看看Sobell,RobertsPrewit過濾器。一,你可以用最簡單的過濾器是

0 1 0 
1 -4 1 
0 1 0 

您可以在OpenCV中做到這一點(但我沒有在它很多經驗)。我首選的工具是MATLAB。您可以使用其內置功能,例如edge(這裏是tutorial),或者編寫一個簡單的代碼,使用兩個for循環遍歷圖像中的所有像素並計算這些濾波器應用的值。