Imagemagick扩展图像边框

3
我希望使用PHP Imagemagick来检测图像的边缘,扩展边缘区域,并在其后面放置一个纯色背景。以下是输入图像:

而这将是期望的输出:

使用Imagemagick可以实现吗?

棋盘区域是否应该表示透明? - Mark Setchell
是的,这张图片有透明度,所以我在它后面放了棋盘格,这样它就不会看起来像一个纯白色的背景了。 - Maximillian
3个回答

4

我认为这是可能的 - 这是我的方法。我相信它可以简化为一个单一的命令,但在我过度考虑之前,让我们看看你是否喜欢它。

首先,我认为的第一步是用黑色填充内部的"孔"。为此,我将其压平到一个黑色背景上,使所有透明区域变为黑色,然后从左上角开始使用透明度进行泛洪填充以去除"外围"黑色。

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

enter image description here

接下来,我需要准备形态学处理。为了做到这一点,经典的方法是在黑色背景上放置一个白色的形状,因此让我们制作一个这样的形状。我将其压平到白色背景上,然后使用洪水填充算法将“外部”区域填充为黑色。然后进行阈值处理,使青色区域变为白色。
convert -background white drop.png -flatten -fill black -draw "color 0,0 floodfill" -threshold 1% y.png

enter image description here

现在我想进行膨胀操作,以扩大白色区域以形成边框,但与其进行膨胀并计算与原始图像的差异,我可以使用完全相同的EdgeOut形态学方法。然后我反转图像,使白色膨胀区域变成黑色轮廓,并将白色区域设为透明,以便在下一步中叠加。
convert y.png -morphology edgeout disk:7 -negate -transparent white z.png

enter image description here

现在,我所需要做的就是将加粗边缘与第一步的结果合成。
convert x.png z.png -composite result.png

enter image description here


这几乎是准确无误的。有没有办法使边缘更加平滑? 我使用您的命令测试了几个,它们看起来都相当粗糙。 - Maximillian
不确定您实际的图片是什么样子,但您发布的那些图片有很多JPEG伪像 - 希望您使用的是PNG格式?一种选择是用两个 -morphology edgeout disk:3 代替 -morphology edgeout disk:7。另一种选择是对原始大小进行超采样到4倍然后再缩小以获得平滑处理。 - Mark Setchell

0

您可以从二进制图像开始,使用以下方法创建带有透明度的抗锯齿边缘图像:

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

enter image description here


0

正如您提到的轮廓有点粗糙,我想部署一个新工具来帮助您获得平滑的曲线 - potrace。基本上,它会将黑白PBM(或其他)格式文件转换为SVG文件 - 它还可以生成EPS等文件,因此在我低估这个神奇的程序之前,请查看手册。无论如何,从我的先前解决方案开始,但在生成轮廓文件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>

最终,这个操作将通过Imagemagick PHP扩展完成,因此通过其他程序传输imagemagick输出的管道不起作用。 - Maximillian
你不必使用管道 - 你可以直接从IM中编写一个PBM文件,然后调用potrace来处理它。 - Mark Setchell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接