找到黑白图像的边缘

Find edge of black and white image

我需要找到边缘并生成黑白图像的点,如下图所示:

我不知道该怎么做。我知道 OpenCV 是一个选项,但对于肯定是一项简单的任务来说,这太过分了。有谁知道任何简单的方法来做到这一点?图书馆可以,只要它们不是太重量级(header 唯一首选)

你要找的是边缘检测。如果图片像上面贴的一样干净,那么边缘检测的结果就很完美,之后就不需要再做其他处理了。

那么我们如何进行边缘检测呢?我假设您知道图像在计算机中存储为具有强度值的二维矩阵。所以,如果你在图像上应用了一个掩码,即取一个小矩阵,计算它在图像不同点的值,然后用计算结果代替矩阵中心的值,你就可以进行边缘检测。

为此目的有很多面具。我建议您查看 SobellRobertsPrewit 过滤器。您可以使用的最简单的过滤器之一是

0  1  0
1  -4 1
0  1  0

您可以在 openCV 中执行此操作(但我没有太多经验)。我首选的工具是 MATLAB。您可以使用它们的内置函数,例如 edge(这里是 tutorial),或者编写一个简单的代码,在其中使用两个 for 循环遍历图像中的所有像素并计算这些过滤器应用的值。

我会使用 Canny Edge Detection,尽管您可以轻松地尝试使用 @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. There is a reasonable tutorial here

如果你想要理论的描述和用法的例子,包括Sobel等,请看Anthony Thyssen的优秀页面here

根据您的实际操作,形态学技术(形状检测)可能比边缘检测技术更适合您。如果是这样,ImageMagick 也可以为您做到这一点。例如:

convert blob.png -morphology EdgeIn Octagon edgein.png

该技术描述得很好 here

如果您希望轮廓作为矢量路径,您可以通过中间 PBM 文件组合 ImageMagickpotrace,如下所示:

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>