【问题标题】:How to convert image areas to white or transparent?如何将图像区域转换为白色或透明?
【发布时间】:2020-12-30 11:31:47
【问题描述】:

我正在尝试将下图中的某些矩形区域转换为白色或透明。

我可以使用 ImageMagick 使用以下命令来制作它,首先使所需颜色透明,最后用“否定”将其余颜色转换为黑色。

convert input.png \
-transparent '#4B8DF8'  \
-transparent '#27A9E3'  \
-transparent '#2295C9'  \
-transparent '#E7191B'  \
-transparent '#C91112'  \
-transparent '#28B779'  \
-transparent '#17A769'  \
-transparent '#852B99'  \
-transparent '#751E88'  \
-transparent '#D84A38'  \
-transparent '#B4CEF8'  \
-transparent '#17A76A'  \
-transparent '#CA1112'  \
-transparent '#2296CA' \
-transparent '#DDE8FA' \
-alpha extract -negate out_convert.png

我目前拥有的 Python/Wand 脚本是这样的:

from wand.image import Image

with Image(filename='input.png') as img:
    img.transparent_color('#4B8DF8', alpha=0.0)
    img.transparent_color('#27A9E3', alpha=0.0)
    img.transparent_color('#2295C9', alpha=0.0)
    img.transparent_color('#E7191B', alpha=0.0)
    img.transparent_color('#C91112', alpha=0.0)
    img.transparent_color('#28B779', alpha=0.0)
    img.transparent_color('#17A769', alpha=0.0)
    img.transparent_color('#852B99', alpha=0.0)
    img.transparent_color('#751E88', alpha=0.0)
    img.transparent_color('#D84A38', alpha=0.0)
    img.transparent_color('#B4CEF8', alpha=0.0)
    img.transparent_color('#17A76A', alpha=0.0)
    img.transparent_color('#CA1112', alpha=0.0)
    img.transparent_color('#2296CA', alpha=0.0)
    img.transparent_color('#DDE8FA', alpha=0.0)
    img.negate()
    img.save(filename='out_python.png')

下面我展示了我使用convert 命令得到的输出(只有黑色和白色)以及使用python/wand 脚本得到的输出(除了黑色和白色之外,它还有一些其他颜色)。

为了获得与 ImageMagick 相同的输出,我的脚本中缺少什么? Wand 是一个很好的 Python 库还是可以用另一个库来完成?

【问题讨论】:

    标签: python python-3.x image-processing imagemagick wand


    【解决方案1】:

    您只需在 ImageMagick 中对图像进行阈值处理,即可将所有颜色转换为白色,但黑色除外。

    convert rectangles.png -threshold 0 rectangles2.png
    

    或者只是把除了白色以外的所有颜色都变成白色

    convert rectangles.png -fill white +opaque white rectangles3.png
    

    或者只是将图像着色为白色

    convert rectangles.png -fill white -colorize 100 rectangles4.png
    

    我误解了你的问题吗?

    如果您已识别出所有颜色,但它们没有在您的代码中转换为白色,那是因为某些颜色略有不同。因此,只需在您的第一个 -transparent 命令之前添加 -fuzz XX% 即可。尝试 XX=0% 启动并根据需要增加。

    补充:

    我怀疑这就是你想要的。你很亲密。你只需要添加一些模糊值。但我没有让它透明,而是使用 opaque_fill() 直接转换为白色。

    输入:

    from wand.image import Image
    from wand.display import display
    
    with Image(filename='color_rectangles.png') as img:
        img.opaque_paint(target='#5f8bfc', fill='white', fuzz=0.30*img.quantum_range, invert=False)
        img.opaque_paint(target='#43ad49', fill='white', fuzz=0.30*img.quantum_range, invert=False)
        img.opaque_paint(target='#831d98', fill='white', fuzz=0.30*img.quantum_range, invert=False)
        img.save(filename='color_rectangles_fill_white.png')
        display(img)
    

    请注意,可以使用低至 0.05 的quantum_range 因子并更改大部分颜色,但由于在绘制框时使用抗锯齿,您需要尽可能增加它以移除轮廓而不更改其他颜色。

    【讨论】:

    • 感谢您的帮助。实际上,我尝试在 python 中复制 ImageMagick 所做的。如果我可以在更短的convert 命令中使用 ImageMagick 获得相同的结果,我认为在 Python 中复制它会更容易。我尝试了您的 3 个命令,但使用 3 个命令,我得到了一个完整的白色输出图像。例如,我想将蓝色、绿色、红色、紫色(我列出的颜色)转换为白色,其余的转换为黑色。我开始转换为透明,因为在 input.png 实际上有我不感兴趣的白色区域。
    • 查看我对答案的补充
    • 非常感谢。它非常接近我现在正在寻找的东西。我不得不提问。为什么您只使用 3 种颜色,甚至与我使用的颜色不同,而您的输出几乎正确? (因为仍然保留一个橙色矩形)。另一个问题,将矩形转换为白色后,如何使它们透明?这是为了否定最终使所有矩形透明而其余的为黑色?
    • 您说您只想转换这些颜色。所以我用其他一些工具测量了矩形,它给出的值略有不同。这在 JPG 中尤其常见,它会因压缩而改变颜色。从显示器读取的测量工具也可以读取略有不同的值。我不知道你的哪个颜色是有问题的。它起作用的原因是颜色与您的值不符。所以我需要添加一个大的 -fuzz 值,它允许对可能发生变化的颜色进行容忍。此外,由于抗锯齿,框的轮廓更加不同。
    • 感谢您的回答。接受以来对我有很大帮助,你分享了一个很好的实现目标的方法。问候
    【解决方案2】:

    为了获得与 ImageMagick 相同的输出,我的脚本中缺少什么?

    您缺少与-alpha extract 等效的。只需添加img.alpha_channel = 'extract',两个输出应该匹配。

     with Image(filename='input.png') as img:
        img.transparent_color('#4B8DF8', alpha=0.0)
        img.transparent_color('#27A9E3', alpha=0.0)
        img.transparent_color('#2295C9', alpha=0.0)
        img.transparent_color('#E7191B', alpha=0.0)
        img.transparent_color('#C91112', alpha=0.0)
        img.transparent_color('#28B779', alpha=0.0)
        img.transparent_color('#17A769', alpha=0.0)
        img.transparent_color('#852B99', alpha=0.0)
        img.transparent_color('#751E88', alpha=0.0)
        img.transparent_color('#D84A38', alpha=0.0)
        img.transparent_color('#B4CEF8', alpha=0.0)
        img.transparent_color('#17A76A', alpha=0.0)
        img.transparent_color('#CA1112', alpha=0.0)
        img.transparent_color('#2296CA', alpha=0.0)
        img.transparent_color('#DDE8FA', alpha=0.0)
        img.alpha_channel = 'extract'
        img.negate()
        img.save(filename='out_python.png')
    

    【讨论】:

    • 非常感谢您的回答。它工作得很好。我很难在魔杖中找到正确的等价物。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-07
    • 2012-11-23
    • 2012-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多