如何为图像添加边框,根据图像边缘颜色动态选择颜色?
How to add border to an image, choosing color dynamically based on image edge color(s)?
我需要为一组紧密裁剪的徽标中的每个图像添加边框。边框颜色应与沿边缘最常用的颜色匹配,或者,如果有太多不同的边缘颜色,则应选择某种边缘颜色的平均值。
举个例子。在这种情况下,我希望添加的边框与图像“背景”的颜色相同(在外行意义上使用该术语)。沿边缘的大部分像素都是这种颜色,并且只有两种其他颜色,因此决策算法将能够 select 为添加的边框添加相当暗淡的棕褐色(没有说任何不好的)请注意,徽标背后的组织)。
Pillow 有什么功能可以简化这个任务吗?
我找到了说明如何 use Pillow to add borders and how to determine the average color of an entire image 的答案。但是我找不到任何仅查看图像边缘并找到主要颜色的代码,然后可以在添加边框的例程中使用该颜色。以防万一有人已经完成了这项工作,请指点一下。 ('Edges' 表示沿图像 top/bottom/left/right 边缘的像素带,其高度或宽度将指定为图像总大小的百分比。)
没有指出解决我整个问题的要点,是否有 Pillow 例程查看边缘 and/or 计算像素范围内的颜色并将它们放入数组或什么不?
我看到 here OpenCV 可以添加一个边框,该边框复制沿所有四个边缘的每个最外层像素的颜色,但这看起来很时髦——我想要一个纯色边框。而且我更愿意坚持使用 Pillow——除非另一个库可以一步完成整个边缘颜色分析和添加边框过程,或多或少,在这种情况下,请指出。
用某种固定颜色覆盖图像的中心部分,这种颜色很可能不会出现在边缘内。为此,可以使用具有特定 alpha 值的颜色。然后,有一个函数 getcolors
, which exactly does, what you're looking for. Sort the resulting list, and get the color with the highest count. (That, often, will be the color we used to overwrite the center part. So check for that, and take the second entry, if needed.) Finally, use 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
----------------------------------------
我需要为一组紧密裁剪的徽标中的每个图像添加边框。边框颜色应与沿边缘最常用的颜色匹配,或者,如果有太多不同的边缘颜色,则应选择某种边缘颜色的平均值。
举个例子。在这种情况下,我希望添加的边框与图像“背景”的颜色相同(在外行意义上使用该术语)。沿边缘的大部分像素都是这种颜色,并且只有两种其他颜色,因此决策算法将能够 select 为添加的边框添加相当暗淡的棕褐色(没有说任何不好的)请注意,徽标背后的组织)。
Pillow 有什么功能可以简化这个任务吗?
我找到了说明如何 use Pillow to add borders and how to determine the average color of an entire image 的答案。但是我找不到任何仅查看图像边缘并找到主要颜色的代码,然后可以在添加边框的例程中使用该颜色。以防万一有人已经完成了这项工作,请指点一下。 ('Edges' 表示沿图像 top/bottom/left/right 边缘的像素带,其高度或宽度将指定为图像总大小的百分比。)
没有指出解决我整个问题的要点,是否有 Pillow 例程查看边缘 and/or 计算像素范围内的颜色并将它们放入数组或什么不?
我看到 here OpenCV 可以添加一个边框,该边框复制沿所有四个边缘的每个最外层像素的颜色,但这看起来很时髦——我想要一个纯色边框。而且我更愿意坚持使用 Pillow——除非另一个库可以一步完成整个边缘颜色分析和添加边框过程,或多或少,在这种情况下,请指出。
用某种固定颜色覆盖图像的中心部分,这种颜色很可能不会出现在边缘内。为此,可以使用具有特定 alpha 值的颜色。然后,有一个函数 getcolors
, which exactly does, what you're looking for. Sort the resulting list, and get the color with the highest count. (That, often, will be the color we used to overwrite the center part. So check for that, and take the second entry, if needed.) Finally, use 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
----------------------------------------