【问题标题】:ImageMagick to crop image based on based on rectangular border colorImageMagick 基于矩形边框颜色裁剪图像
【发布时间】: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

这有点工作但并不完美:

【问题讨论】:

    标签: image-processing ffmpeg imagemagick ocr


    【解决方案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】:

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

    所以,计划如下:

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

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

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

    所以,对于第 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
    

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

    【讨论】:

    • 谢谢你的回答,好像对我有用,我试试看:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-16
    • 2013-01-11
    • 2020-03-20
    • 1970-01-01
    • 1970-01-01
    • 2011-09-12
    • 1970-01-01
    相关资源
    最近更新 更多