Imagemagick 扩展图像边框

Imagemagick expand image border

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

这将是预期的输出:

这可以用 Imagemagick 实现吗?

我认为这是可能的 - 这是我的方法。我相信它可以简化为一个命令,但让我们先看看你是否喜欢它,然后再考虑太多。

第一步,如我所见,是用黑色填充内部"hole"。为此,我在黑色背景上展平,使所有透明区域都变成黑色,然后从左上角开始用透明度填充以移除 "outlying" 黑色。

convert -background black drop.png -flatten -fill none -draw 'color 0,0 floodfill' x.png

接下来,我需要准备形态学。为此,您通常需要黑色背景上的白色形状,所以让我们制作其中一个。我在白色背景上展平,然后用黑色填充 "outside" 区域。然后阈值使青色区域变白。

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

你现在可以合成那个而不是我的 "slightly jaggy" 版本 ;-)

矢量文件看起来像这样 - 没有什么可以阻止您对其进行编辑和更改填充,and/or 线条粗细,因为它只是 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>

您可以从二值图像开始,然后使用

创建具有透明度的抗锯齿边缘图像
convert uwtW3.png -morphology edgeout disk:7 -negate -blur 0x2 -level 50x100% \( +clone -negate \) -alpha off -compose copy_opacity -composite edge_transparent.png