我不知道该怎么做。我知道OpenCV是一个选项,但这对于肯定是一项简单的任务来说是过度的。有谁知道这么做的简单方法?图书馆是可以的,只要它们不是太重量级(标题只是首选)
答案 0 :(得分:3)
我会使用Canny边缘检测,但您可以轻松地试验@therainmaker建议的其他人。我会使用ImageMagick,它是免费的,安装在大多数Linux发行版上,也适用于OS X和Windows。
在命令行中,您将使用:
convert blob.png -canny 0x1+10%+30% result.png
或者这个:
convert blob.png -canny 0x1+10%+30% -negate result.png
要与C ++一起使用,您可以使用Magick++
,其描述为here。有一个合理的教程here。
如果您想要描述理论和使用示例,包括Sobel等,请查看Anthony Thyssen的精彩页面here。
根据您实际所做的事情,您可能会通过形态学技术(形状检测)而不是边缘检测技术获得更好的服务。如果是这样,ImageMagick也可以为您做到这一点。例如:
convert blob.png -morphology EdgeIn Octagon edgein.png
很好地描述了这种技术here。
如果您希望将轮廓作为矢量路径,则可以将ImageMagick
和potrace
合并为一个中间PBM
文件,如下所示:
convert blob.png -canny 0x1+10%+30% -negate pbm:- | potrace -s -o result.svg
这会给你一个很好的平滑矢量路径:
<?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>
答案 1 :(得分:1)
您正在寻找的是边缘检测。如果图像像上面发布的图像一样干净,边缘检测的结果将是完美的,并且在其之后不需要进行其他处理。
那么我们如何进行边缘检测?我假设您知道图像存储为计算机中具有强度值的2D矩阵。因此,如果您在图像上应用了一个遮罩,即取一个小矩阵,在图像的不同点计算其值,并用计算结果替换矩阵中心的值,则可以进行边缘检测。
为此目的有很多面具。我建议您查看Sobell
,Roberts
和Prewit
过滤器。您可以使用的最简单的过滤器之一是
0 1 0
1 -4 1
0 1 0
您可以在openCV中执行此操作(但我没有太多经验)。我首选的工具是MATLAB。您可以使用内置函数,例如edge
(这里是tutorial),或者编写一个简单的代码,在其中使用两个for
循环迭代图像中的所有像素并计算这些过滤器应用的值。