Python 如何获取不包含特定RGB值的区域的边界框

Python 如何获取不包含特定RGB值的区域的边界框,python,python-imaging-library,rgb,Python,Python Imaging Library,Rgb,我目前正在使用PIL.Image.Image.getbbox()获取图像非零(不透明)区域的边界框 如果我有一个具有特定颜色背景的图像怎么办?我怎样才能得到图像的边界框呢?与getbbox()的想法相同,但我没有指定非零,而是指定了RGB值。恐怕我的评论没有正确表达我想要建议的内容。所以,这里有一个完整的答案: 复制你的图像(那一个,有特定的背景色) 在该副本上,将特定背景色替换为黑色 对该副本调用getbbox 也许,下面的代码和示例让事情变得更清楚: 将numpy导入为np 从PIL导入

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


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

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

  • 复制你的图像(那一个,有特定的背景色)
  • 在该副本上,将特定背景色替换为黑色
  • 对该副本调用
    getbbox
也许,下面的代码和示例让事情变得更清楚:

将numpy导入为np
从PIL导入图像,ImageDraw
#黑色背景
img=Image.new('RGB',(400400),(0,0,0))
draw=ImageDraw.draw(img)
绘制矩形((40,40,160,160),(255,0,0))
绘制矩形((280、260、380、330)、(0、255、0))
img.save('black_bg.png'))
打印(img.getbbox(),“\n”)
#特定颜色背景
背景颜色=(255,255,0)
img=Image.new('RGB',(400400),背景色)
draw=ImageDraw.draw(img)
绘制矩形((40,40,160,160),(255,0,0))
绘制矩形((280、260、380、330)、(0、255、0))
img.save('color\u bg.png')
打印(img.getbbox(),“\n”)
#建议更换颜色(在图像副本上)-仅枕头,速度慢
img_copy=img.copy()
对于范围内的y(img_copy.size[1]):
对于范围内的x(img_copy.size[0]):
如果img_copy.getpixel((x,y))==bg_颜色:
img_copy.putpixel((x,y),(0,0,0))
打印(img_copy.getbbox(),“\n”)
#建议更换颜色(在图像副本上)-NumPy,快速
img_copy=np.array(img)
img_copy[np.all(img_copy==bg_color,轴=2),:]=0
打印(Image.fromarray(img\u copy).getbbox())
有一个黑色背景的图像:

getbbox
的相应输出为:

(40、40、381、331)
此外,还有一个具有特定背景颜色(黄色)的图像:

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

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

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

----------------------------------------
系统信息
----------------------------------------
平台:Windows-10-10.0.16299-SP0
Python:3.8.5
努比:1.19.5
枕头:8.1.0
----------------------------------------

相应地(黑色、零度、透明),只需在该图像上运行
getbbox()
!?不,因为这是颜色替换。我想得到非-(特定颜色)区域的边界框。