【问题标题】:How to get the bounding box of regions excluding specific RGB values如何获取不包括特定 RGB 值的区域的边界框
【发布时间】:2021-01-20 01:04:43
【问题描述】:

我目前正在使用PIL.Image.Image.getbbox() 来获取图像非零(非透明)区域的边界框。

如果我的图片具有特定颜色的背景怎么办?那我怎样才能得到图像的边界框呢?与getbbox() 的想法相同,但我指定了 RGB 值,而不是非零值。

【问题讨论】:

  • Replace that single color 相应地(黑色、零、透明),然后在该图像上运行 getbbox()!?
  • 否,因为这是颜色替换。我想获取非(特定颜色)区域的边界框。

标签: python python-imaging-library rgb


【解决方案1】:

恐怕我的评论没有正确表达我想要建议的内容。所以,这是一个完整的答案:

  • 复制您的图片(具有特定背景颜色的图片)。
  • 在该副本上,将特定背景颜色替换为黑色。
  • 在该副本上致电 getbbox

也许,下面的代码和例子让事情更清楚了:

import numpy as np
from PIL import Image, ImageDraw

# Black background
img = Image.new('RGB', (400, 400), (0, 0, 0))
draw = ImageDraw.Draw(img)
draw.rectangle((40, 40, 160, 160), (255, 0, 0))
draw.rectangle((280, 260, 380, 330), (0, 255, 0))
img.save('black_bg.png')

print(img.getbbox(), '\n')

# Specific color background
bg_color = (255, 255, 0)
img = Image.new('RGB', (400, 400), bg_color)
draw = ImageDraw.Draw(img)
draw.rectangle((40, 40, 160, 160), (255, 0, 0))
draw.rectangle((280, 260, 380, 330), (0, 255, 0))
img.save('color_bg.png')

print(img.getbbox(), '\n')

# Suggested color replacing (on image copy) - Pillow only, slow
img_copy = img.copy()
for y in range(img_copy.size[1]):
    for x in range(img_copy.size[0]):
        if img_copy.getpixel((x, y)) == bg_color:
            img_copy.putpixel((x, y), (0, 0, 0))

print(img_copy.getbbox(), '\n')

# Suggested color replacing (on image copy) - NumPy, fast
img_copy = np.array(img)
img_copy[np.all(img_copy == bg_color, axis=2), :] = 0

print(Image.fromarray(img_copy).getbbox())

只有一张黑色背景的图片:

getbbox对应的输出为:

(40, 40, 381, 331) 

另外,还有一张带有特定背景颜色(黄色)的图片:

在该图像上调用 getbbox - 显然 - 返回:

(0, 0, 400, 400) 

通过简单地将第二张图像的某些副本中的黄色替换为黑色,我们再次从getbbox 获得正确的结果(两种建议的方法):

(40, 40, 381, 331) 

(40, 40, 381, 331)

由于在 Pillow 中迭代单个像素有点慢,您还可以使用 NumPy 的矢量化功能来加速该任务。

----------------------------------------
System information
----------------------------------------
Platform:      Windows-10-10.0.16299-SP0
Python:        3.8.5
NumPy:         1.19.5
Pillow:        8.1.0
----------------------------------------

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-13
    • 2021-01-05
    • 1970-01-01
    • 1970-01-01
    • 2021-04-29
    • 2021-04-01
    • 2021-11-07
    • 2021-09-27
    相关资源
    最近更新 更多