【问题标题】:Replace white coloured rows in image using python使用python替换图像中的白色行
【发布时间】:2019-06-24 01:49:47
【问题描述】:

我正在尝试修剪图像的一部分,其中整行图像除了白色之外什么都没有。

我尝试使用 matplot 库

  1. 将图像转换为矩阵并查看是否 (r,g,b) = (0,0,0) 或 (1,1,1),如果每个 (r,g,b) 为上面那种在行中

    矩阵看起来像 [ [ [[r,g,b], [r,g,b]....] ],...., [ [r,g,b], [r,g,b ]....] ] ]

我达到了我的要求,但我正在运行大约 500 张图像,大约需要 30 分钟。我可以用更好的方式来做吗?

所需的图像应该是这样的

Edit-1: 尝试使用 wand 包中的 trim 方法

with wand_img(filename=path) as i:
# i.trim(color=Color('white'))
# i.trim(color=Color('white'))
i.trim()
i.trim()
i.save(filename='output.png')

但不适用于以下类型的images

【问题讨论】:

    标签: python matplotlib image-processing python-imaging-library


    【解决方案1】:

    您可以使用 ImageMagick,它安装在大多数 Linux 发行版上,适用于 macOS 和 Windows。

    要修剪一张图像,请启动终端(或 Windows 上的命令提示符)并运行:

    magick input.png -fuzz 20% -trim result.png
    

    这会给你这个 - 虽然我添加了一个黑色边框,所以你可以看出它的范围:

    如果您有很多事情要做,您可以像这样与 GNU Parallel 并行执行:

    parallel -X magick mogrify -trim ::: *png
    

    我复制了 1,000 张您的图片,并在 MacBook Pro 上在 4 秒内完成了全部工作。

    如果您没有 GNU Parallel,您可以像这样在 12 秒内完成 1,000 张图像:

    magick mogrify -trim *png
    

    如果你想用 Python 来做,你可以试试这样:

    #!/usr/bin/env python3
    
    from PIL  import Image, ImageChops
    
    # Load image and convert to greyscale
    im = Image.open('image.png').convert('L') 
    
    # Invert image and find bounding box
    bbox = ImageChops.invert(im).getbbox()
    
    # Debug
    print(*bbox)
    
    # Crop and save
    result = im.crop(bbox)
    result.save('result.png')       
    

    它提供与 ImageMagick 版本相同的输出。我建议您使用线程工具并行执行大量操作以获得最佳性能。

    顺序版本需要 65 秒处理 1000 张图像,多处理版本需要 14 秒处理 1000 张图像。

    【讨论】:

    • 谢谢@Mark,这可以用python工具实现吗,因为我很多地方都需要这个图片,一般不建议通过代码执行os命令。
    • 我添加了一个 Python 版本和一些基准测试 - 请再看看。
    • 您应该能够使用调用 Imagemagick 的 Python Wand。在docs.wand-py.org/en/0.5.0/wand/image.html 查找修剪功能
    • 感谢@Mark,我现在将通过它并用我的用例进行验证
    • @fmw42,即使修剪也不适用于此图像imgur.com/s7C1pml
    【解决方案2】:

    在 Imagemagick 6.9.10.25 Q16 Mac OSX Sierra 中使用两个修剪对我来说效果很好。您的图像右侧有一个黑条。第一次修剪将删除它。第二次修剪将去除剩余的多余白色。您可能需要为修剪添加一些绒毛(公差)量。但我不需要它。

    输入:

    convert img.png -trim +write tmp1.png -trim result.png
    

    第一次修剪的结果 (tmp1.png):

    第二次修剪后的最终结果:

    补充:

    查看 Python Wand 的文档:

    trim(*args, **kwargs)
    Remove solid border from image. Uses top left pixel as a guide by default, or you can also specify the color to remove.
    
    Parameters: 
    color (Color) – the border color to remove. if it’s omitted top left pixel is used by default
    fuzz (numbers.Integral) – Defines how much tolerance is acceptable to consider two colors as the same.
    


    您需要为第一次修剪指定 color=black,因为此版本的修剪使用左上角进行修剪。命令行 Imagemagick 查看所有角落。如果失败,则添加一些模糊值。

    【讨论】:

    • 谢谢@fmw42,我昨天用类似的颜色解决了这个问题[在我的时间线中:)]
    猜你喜欢
    • 2017-08-20
    • 2019-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-03
    • 2022-07-04
    • 2019-03-28
    • 1970-01-01
    相关资源
    最近更新 更多