ImageMagick 基于矩形边框颜色裁剪图像

Posted

技术标签:

【中文标题】ImageMagick 基于矩形边框颜色裁剪图像【英文标题】:ImageMagick to crop image based on based on rectangular border color 【发布时间】:2021-11-01 18:10:51 【问题描述】:

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

我想根据某种颜色的边框(在这种情况下为#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

这有点工作但并不完美:

【问题讨论】:

【参考方案1】:

以下是在 ImageMagick 中使用连接组件处理的方法。我指定您想要的颜色和允许多少变化的模糊值。这假设您想要该颜色的最大框并且大于 500 像素。这是 Unix 语法。但是可以为 Windows 开发类似的代码。

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

连接的组件参数执行以下操作:

从详细列表中排除标题 只保留大于 500 像素的区域 只保留最大的非背景颜色(白色)和背景区域(黑色) 详细列出所选地区 获取详细列表中区域的平均颜色

之后,它通过管道传递到 grep 以过滤以仅保留白色区域,即 gray(255),然后传递到 awk 以从列表中选择边界框。

输入:

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 $2'`
echo "$bbox"
convert textbox.png -crop $bbox +repage textbox_crop.png

裁剪结果:

【讨论】:

谢谢,哇,这比我预期的要复杂得多,但正是我要找的! 大部分代码只是告诉连接的组件如何呈现数据。见imagemagick.org/script/connected-components.php 我已编辑我的答案以提供有关代码和参数的更多详细信息。 谢谢,该编辑对了解到底发生了什么非常有帮助!【参考方案2】:

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

所以,计划如下:

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

    一旦我们找到那个 50x50 的方块,就从那里开始用红色填充,然后将其他所有东西都变成黑色

    获取修剪框并将其应用于原件

所以,对于第 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 步)这次获取修剪框而不是创建输出图像:

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

现在我们可以使用该修剪框裁剪原件:

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

请注意,我这样做比较匆忙,您可能需要调整一些小事情...

【讨论】:

谢谢你的回答,好像对我有用,我试试看:)

以上是关于ImageMagick 基于矩形边框颜色裁剪图像的主要内容,如果未能解决你的问题,请参考以下文章

使用 Imagemagick 从图像中自动裁剪文本(签名)并更改背景颜色

使用 ImageMagick 处理 9-Patch 图像

Imagemagick 将透明图像裁剪为蒙版

裁剪图像具有不同的黑色边距

使用 ImageMagick(图像裁剪语法)从其他部分组装图像

颤动圆角矩形边框,每边具有不同的颜色