ImageMagick - 更改选定边界框的背景颜色

ImageMagick - change the background color of the selected bounding box

我已经有了选定边界框的规范化顶点(例如 xmin: 0.68,ymin: 0.47,xmax: 0.94,ymax: 0.82),我想将此框保存在另一个 .jpg 文件中。此外,在原始图像中,我想让这个突出显示的框全白。这可能使用 Imagemagick 吗?

从这里开始:

并且知道纪念碑的 top-left 角位于 400,10 并且 bottom-right 位于 500,200,您可以使用以下命令将纪念碑提取到文件中:

magick photo.jpg -crop 100x190+400+10 extract.jpg

并用以下方法涂成白色:

magick photo.jpg -fill white -draw "rectangle 400,10 500,200" overpainted.jpg

或者,为了额外的乐趣,用 semi-transparent 白色覆盖:

magick photo.jpg -fill "rgba(255,255,255,0.5)" -draw "rectangle 400,10 500,200" overpainted.jpg


您可以通过以下方式一次性完成这两项操作:

magick photo.jpg \( +clone -fill white -draw "rectangle 400,10 500,200" -write overpainted.jpg +delete \) -crop 100x190+400+10 extract.jpg

使用 ImageMagick 版本 6,下面的命令将创建两个输出图像。 (ImageMagick 版本 7 的示例命令在回复的下方。)

将使用从 w*0.68xh*0.47 开始到 w*0.94xh*0.82 结束的边界框从输入图像裁剪第一张输出图像。

第二个输出将是带有白色部分的输入,对应于 sub-image 裁剪出的第一张图像。

convert input.png \
   -set option:distort:viewport "%[fx:(w*0.94)-(w*0.68)]x%[fx:(h*0.82)-(h*0.47)]" \
   \( +clone -distort affine "0,0 -%[fx:w*0.68],-%[fx:h*0.47]" \
   -write result1.png -fill white -colorize 100 \) \
   -set page "%[fx:u.w]x%[fx:u.h]+%[fx:t*(u.w*0.68)]+%[fx:t*(u.h*0.47)]" \
   -flatten result2.png

首先读取输入图像并根据您提供的边界框尺寸计算视口、sub-image 要裁剪的尺寸。

然后在括号内它创建一个克隆并执行“-扭曲仿射”,实际上,裁剪图像并将其正确定位在该视口中。它将结果写入第一个输出图像 "result1.png"。然后,仍然在括号内,用白色填充裁剪的部分。

之后它会设置分页几何形状,以便最终可以将白色部分合成回其在输入图像上的原始位置。

它通过将白色部分压平到输入图像上来完成,并写入第二个输出图像"result2.png"。

同样的事情可以使用 ImageMagick 版本 7 和一个稍微不那么复杂的命令来完成...

magick input.png \
   \( +clone \
   -crop "%[fx:(w*0.94)-(w*0.68)]x%[fx:(h*0.82)-(h*0.47)]+%[fx:w*0.68]+%[fx:h*0.47]" \
   -write result1.png -fill white -colorize 100 \) \
   -flatten result2.png

直接在“-crop”操作中进行计算,分页几何图形保存在裁剪后的部分中,因此无需重新设置几何图形即可将其展平回原始位置。

这些是 *nix 语法。要使其在 Windows 中工作,请将续行反斜杠“\”更改为脱字符“^”,并消除那些转义括号“\(...\)”的反斜杠。

这是 ImageMagick 6 的另一种变体。它裁剪图像并保存,然后将其删除。然后它使用 -region 将白色写入该边界框。

这是 Unix 语法。对于 Windows,从括号中删除 \ 并将行尾 \ 更改为 ^.

输入:

convert img.jpg \
\( +clone -crop 100x190+400+10 +repage +write result1.jpg +delete \) \
-region 100x190+400+10 -fill white -colorize 100 +region result2.jpg