ImageMagick 根据矩形边框颜色裁剪图像

ImageMagick to crop image based on based on rectangular border color

我有一些图像想裁剪,但希望通过命令行而不是手动裁剪。

我想根据某种颜色的边框(在本例中为#31393C)裁剪图像(我已经裁剪了上半部分,对其他颜色进行去饱和处理并使用 ffmpeg 分割帧)。例如,我想要这张图片: 像这样裁剪:

我尝试了一些命令,但不幸的是它们对我不起作用。

convert image.jpg -bordercolor "#31393C" -border 2x2 -fuzz 10% -trim output.jpg

我也尝试过将不是#31393C 的部分填充为白色,然后进行裁剪,这可能是一种解决方案,因为我想提高使用 OCR 的能力:

convert image.jpg -fill white -fuzz 11% +opaque "#31393c" result.jpg
convert result.jpg -bordercolor white -border 10x10 -fuzz 10% -trim output.jpg

有些效果但不完美:

不确定是否有更简单的方法,或者降低颜色饱和度是否是最明智的想法,但以下方法似乎有效。请注意,我们将把您的原始图像的副本弄得一团糟,只是为了获得 trim-box,然后将其应用于未修改的原始图像。

所以,方案如下:

  1. 使用子图像搜索找到一个漂亮的 50x50 深灰色大块,我们确信它会在您要裁剪的大灰色区域中

  2. 一旦我们找到 50x50 块,从那里开始用红色填充,然后将其他所有内容设为黑色

  3. 获取 trim-box 并将其应用于原始

因此,对于第 1 步:

compare -metric RMSE -subimage-search N6rL3.png -size 50x50 "xc:#31393c" locations.png
0 (0) @ 106,351

这是 locations-1.png,你可以看到它是亮白色的,这意味着在你想要的矩形的左上角匹配得很好,我们有那个点的坐标,即 106,351

第 2 步)从该点开始用红色填充,使其他所有部分变为黑色:

magick N6rL3.png -fill red -draw "color 106,351 floodfill" -fill black +opaque red interim.png

步骤 3) 这次获取 trim 框而不是创建输出图像:

magick N6rL3.png -fill red -draw "color 96,351 floodfill" -fill black +opaque red -format %@ info:
1560x152+96+304

现在我们可以使用那个 trim-box 裁剪原件:

magick N6rL3.png -crop 1560x152+96+304 result.png

请注意,我这样做比较仓促,您可能需要调整一些小东西...

下面介绍了如何使用 ImageMagick 中的连通分量处理来完成此操作。我指定了您想要的颜色和允许变化的模糊值。这假定您想要该颜色的最大框并且它大于 500 像素。这是 Unix 语法。但是可以为 Windows.

开发类似的代码

-fuzz ... -fill ... +-opaque ... 本质上是所需颜色的阈值,以便该颜色变为白色而图像的其余部分变为黑色。

连通分量参数执行以下操作:

  • 从详细列表中排除 header
  • 只保留大于 500 像素的区域
  • 仅保留具有最大 non-background 颜色(白色)和背景区域(黑色)的区域
  • 详细列出 selected 地区
  • 获取详细列表中区域的平均颜色

之后,它通过管道传输到 grep 进行过滤以仅保留白色区域,即灰色 (255),然后通过管道传输到 awk 到 select 列表中的边界框。

输入:

color="srgb(49,57,60)"
fuzzval=10
bbox=`convert \
textbox.png \
-fuzz $fuzzval% \
-fill black +opaque "$color" \
-fill white -opaque "$color" \
-type bilevel \
-define connected-components:exclude-header=true \
-define connected-components:area-threshold=500 \
-define connected-components:keep-top=1 \
-define connected-components:verbose=true \
-define connected-components:mean-color=true \
-connected-components 8 null: | \
grep "gray(255)" | awk '{print }'`
echo "$bbox"
convert textbox.png -crop $bbox +repage textbox_crop.png

裁剪结果: