【问题标题】:How to add border to an image, choosing color dynamically based on image edge color(s)?如何为图像添加边框,根据图像边缘颜色动态选择颜色?
【发布时间】:2021-07-13 21:58:06
【问题描述】:

我需要为一组裁剪得很紧的徽标中的每个图像添加一个边框。边框颜色要么与边缘最常用的颜色匹配,要么,如果不同的边缘颜色太多,则应该选择某种边缘颜色的平均值。

这是一个例子。在这种情况下,我希望添加的边框与图像“背景”的颜色相同(在外行意义上使用该术语)。沿边缘的大部分像素都是该颜色,并且只有两种其他颜色,因此决策算法将能够为添加的边框选择相当粗糙的绿色棕褐色(不要说徽标背后的组织有什么不好, 提个醒)。

Pillow 是否有任何功能可以简化此任务?

我找到了显示如何use Pillow to add borders 和如何determine the average color of an entire image 的答案。但是我找不到任何只查看图像边缘并找到主要颜色的代码,然后可以在添加边框的例程中使用该颜色。以防万一有人已经完成了这项工作,请指出我。 (“边缘”表示图像顶部/底部/左侧/右侧边缘的像素带,其高度或宽度将指定为图像总大小的百分比。)

没有给我指出一个解决我的整个问题的要点,是否有 Pillow 例程可以查看边缘和/或计算像素范围内的颜色并将它们放入数组中或其他什么?

我看到here OpenCV 可以添加一个边框,以复制沿所有四个边缘的每个最外层像素的颜色,但这看起来很时髦——我想要一个纯色边框。而且我更愿意坚持使用 Pillow——除非另一个库可以一步完成整个边缘颜色分析和添加边框过程,或多或少,在这种情况下,请指出。

【问题讨论】:

    标签: python-3.x image python-imaging-library border


    【解决方案1】:

    用一些固定颜色覆盖图像的中心部分,这很可能不会出现在边缘内。为此,可能使用具有特定 alpha 值的颜色。然后,有一个函数getcolors,正是你要找的。对结果列表进行排序,并获得计数最高的颜色。 (这通常是我们用来覆盖中心部分的颜色。所以检查一下,如果需要,取第二个条目。)最后,使用ImageOps.expand 添加实际边框。

    这就是整个代码:

    from PIL import Image, ImageDraw, ImageOps
    
    # Open image, enforce RGB with alpha channel
    img = Image.open('path/to/your/image.png').convert('RGBA')
    w, h = img.size
    
    # Set up edge margin to look for dominant color
    me = 3
    
    # Set up border margin to be added in dominant color
    mb = 30
    
    # On an image copy, set non edge pixels to (0, 0, 0, 0)
    img_copy = img.copy()
    draw = ImageDraw.Draw(img_copy)
    draw.rectangle((me, me, w - (me + 1), h - (me + 1)), (0, 0, 0, 0))
    
    # Count colors, first entry most likely is color used to overwrite pixels
    n_colors = sorted(img_copy.getcolors(2 * me * (w + h) + 1), reverse=True)
    dom_color = n_colors[0][1] if n_colors[0][1] != (0, 0, 0, 0) else n_colors[1][1]
    
    # Add border
    img = ImageOps.expand(img, mb, dom_color).convert('RGB')
    
    # Save image
    img.save('with_border.png')
    

    这就是你的例子的结果:

    还有,这是另一张图片的一些输出:

    由您决定是否有几种主色,您想要混合或平均。您需要在几个方面适当地检查n_colors。这是相当多的工作,这里省略了。

    ----------------------------------------
    System information
    ----------------------------------------
    Platform:      Windows-10-10.0.16299-SP0
    Python:        3.9.1
    PyCharm:       2021.1
    Pillow:        8.2.0
    ----------------------------------------
    

    【讨论】:

    • 精彩的执行、解释和演示。你提到的遗漏工作肯定是我的责任。
    猜你喜欢
    • 1970-01-01
    • 2022-06-10
    • 1970-01-01
    • 2011-03-17
    • 1970-01-01
    • 2017-08-21
    • 1970-01-01
    • 2020-07-16
    • 2012-10-01
    相关资源
    最近更新 更多