Imagemagick展开图像边框

Imagemagick展开图像边框,imagemagick,edge-detection,Imagemagick,Edge Detection,我正在PHP Imagemagick中寻找一种方法来检测图像的边缘,扩展边缘区域,并在其后面添加纯色。以下是输入图像: 这将是预期的产出: 这在Imagemagick中可能吗?我认为这是可能的-以下是我的方法。我相信它可以简化为一个命令,但在我想得太多之前,先看看你是否喜欢它 在我看来,第一步是用黑色填充内部的“洞”。为了做到这一点,我在黑色背景上展平,使所有透明区域变为黑色,然后从左上角开始用透明填充,以去除“边缘”黑色 接下来,我需要准备形态学。要做到这一点,你需要一个典型的黑色背景上

我正在PHP Imagemagick中寻找一种方法来检测图像的边缘,扩展边缘区域,并在其后面添加纯色。以下是输入图像:

这将是预期的产出:


这在Imagemagick中可能吗?

我认为这是可能的-以下是我的方法。我相信它可以简化为一个命令,但在我想得太多之前,先看看你是否喜欢它

在我看来,第一步是用黑色填充内部的“洞”。为了做到这一点,我在黑色背景上展平,使所有透明区域变为黑色,然后从左上角开始用透明填充,以去除“边缘”黑色

接下来,我需要准备形态学。要做到这一点,你需要一个典型的黑色背景上的白色形状,所以让我们做其中之一。我在白色背景上展平,然后用黑色填充“外部”区域。然后设置阈值,使青色区域变为白色

convert -background white drop.png -flatten -fill black -draw "color 0,0 floodfill" -threshold 1% y.png

现在我想做一个拨号,扩展白色区域以形成边框,但是我可以使用
EdgeOut
形态学方法,而不是做一个拨号并计算出与原始的差异。然后我反转,使白色脂肪区域成为您的黑色轮廓,并使白色区域透明,以便我可以在下一步覆盖

convert y.png -morphology edgeout disk:7 -negate -transparent white z.png

现在,我所需要做的就是将增肥的边合成到步骤1的结果上

convert x.png z.png -composite result.png

正如您提到的轮廓有点粗,我考虑部署一个新工具来帮助您平滑曲线-
potrace
。基本上,它需要一个黑白
PBM
(或其他)格式的文件,并从中生成一个
SVG
——它还可以生成
EPS
文件等。因此,在我介绍这个惊人的程序之前,请参阅手册页。无论如何,从我以前的解决方案开始,但在生成outine文件
y.png
后,将其转换为黑白
PBM
文件,如下所示,并将其跟踪到平滑向量:

convert -background white z.png -flatten pbm:- | potrace -s -o curve.svg
您现在可以将其合成,而不是我的“略微锯齿状”版本;-)

矢量文件看起来是这样的-没有什么可以阻止您编辑它并更改填充和/或线条厚度,因为它只是ASCII码

<?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="354.000000pt" height="477.000000pt" viewBox="0 0 354.000000 477.000000"
 preserveAspectRatio="xMidYMid meet">
<metadata>
Created by potrace 1.12, written by Peter Selinger 2001-2015
</metadata>
<g transform="translate(0.000000,477.000000) scale(0.100000,-0.100000)"
fill="#000000" stroke="none">
<path d="M2122 4313 c-32 -15 -290 -239 -405 -351 -117 -113 -438 -477 -502
-568 -226 -320 -268 -383 -348 -523 -38 -67 -124 -241 -170 -341 -63 -140
-138 -412 -157 -570 -19 -157 -7 -381 29 -540 30 -134 125 -358 194 -459 78
-114 268 -303 343 -341 16 -8 50 -27 76 -42 75 -43 258 -103 373 -123 98 -16
286 -17 395 -1 285 41 495 150 695 358 101 104 188 222 224 300 57 128 81 198
108 318 21 96 24 370 4 450 -22 92 -61 212 -83 260 -11 25 -27 60 -35 79 -20
47 -123 207 -202 316 -138 187 -368 530 -405 602 -33 66 -84 194 -91 230 -37
178 -43 271 -25 410 14 106 43 266 73 393 15 65 13 107 -7 129 -24 27 -49 31
-84 14z m33 -85 c-18 -83 -24 -108 -39 -183 -68 -334 -71 -447 -22 -675 11
-50 52 -157 89 -234 37 -77 141 -238 307 -476 45 -63 88 -126 98 -140 9 -14
22 -31 29 -38 7 -7 43 -59 80 -115 112 -171 170 -301 215 -487 19 -81 16 -355
-5 -450 -26 -114 -43 -165 -98 -288 -38 -82 -125 -198 -224 -297 -195 -194
-368 -281 -635 -321 -109 -16 -296 -15 -395 1 -113 19 -269 71 -343 113 -26
15 -59 33 -73 40 -68 35 -230 193 -301 293 -80 112 -170 318 -202 462 -33 143
-44 377 -26 527 17 140 79 378 127 490 9 19 22 51 30 70 107 247 278 533 491
820 49 66 50 68 137 170 224 268 443 489 660 668 22 18 54 44 70 57 17 14 32
25 34 25 2 0 0 -15 -4 -32z"/>
</g>
</svg>

由Peter Selinger 2001-2015编写的potrace 1.12创建

您可以从二进制图像开始,使用

convert uwtW3.png -morphology edgeout disk:7 -negate -blur 0x2 -level 50x100% \( +clone -negate \) -alpha off -compose copy_opacity -composite edge_transparent.png

棋盘格区域是否应该表示透明度?是的,图像具有透明度,因此我将棋盘格放在其后面,这样它就不会看起来像纯白背景。这非常准确。有没有办法得到更平滑的边缘?我用一些命令测试了你的命令,它们看起来都很粗。我不确定你的实际图像是什么,但是你发布的那些有很多JPEG人工制品-希望你使用的是PNG?一种选择是用两批
-形态学边缘盘:3
替换
-形态学边缘盘:7
。另一种方法是在处理之前对原始大小的4倍进行超级采样,然后重新调整大小以获得平滑效果。最终,此操作将通过Imagemagick PHP扩展完成,因此,通过其他程序传输imagemagick输出将不起作用。您不必通过管道传输它-您只需从IM编写一个PBM文件,然后调用
potrace
来处理它。
convert uwtW3.png -morphology edgeout disk:7 -negate -blur 0x2 -level 50x100% \( +clone -negate \) -alpha off -compose copy_opacity -composite edge_transparent.png