gpt4 book ai didi

python - 在图像中查找 RGB 颜色的边界框

转载 作者:太空宇宙 更新时间:2023-11-03 13:48:31 24 4
gpt4 key购买 nike

我正在使用页面分割算法。代码的输出写入一个图像,每个区域的像素都分配有唯一的颜色。我想处理图像以找到区域的边界框。我需要找到所有颜色,然后找到该颜色的所有像素,然后找到它们的边界框。

下面是一个示例图像。

Example output image showing colored zones

我目前从 R、G、B channel 的直方图开始。直方图告诉我数据位置。

img = Image.open(imgfilename)
img.load()
r,g,b = img.split()

ra,ga,ba = [ np.asarray(p,dtype="uint8") for p in (r,g,b) ]

rhist,edges = np.histogram(ra,bins=256)
ghist,edges = np.histogram(ga,bins=256)
bhist,edges = np.histogram(ba,bins=256)
print np.nonzero(rhist)
print np.nonzero(ghist)
print np.nonzero(bhist)

输出:(数组([ 0, 1, 128, 205, 255]),)(数组([ 0, 20, 128, 186, 255]),)(数组([ 0, 128, 147, 150, 255]),)

此时我有点困惑。通过目视检查,我有颜色 (0,0,0)、(1,0,0)、(0,20,0)、(128,128,128) 等。我应该如何将非零输出置换为 np.where() 的像素值?

我正在考虑将 3,row,col 数组展平为 24 位压缩 RGB 值 (r<<24|g<<16|b) 的二维平面并搜索该数组。这似乎是蛮力和不雅的。 Numpy 中是否有更好的方法来查找颜色值的边界框?

最佳答案

没有理由将其视为 RGB 彩色图像,它只是其他人所做的分割的可视化。您可以轻松地将其视为灰度图像,对于这些特定的颜色,您无需自己执行任何其他操作。

import sys
import numpy
from PIL import Image

img = Image.open(sys.argv[1]).convert('L')

im = numpy.array(img)
colors = set(numpy.unique(im))
colors.remove(255)

for color in colors:
py, px = numpy.where(im == color)
print(px.min(), py.min(), px.max(), py.max())

如果您不能依赖 convert('L') 提供独特的颜色(即,您使用的是给定图像中颜色以外的其他颜色),您可以打包图像并获得独特的颜色:

...
im = numpy.array(img, dtype=int)

packed = im[:,:,0]<<16 | im[:,:,1]<<8 | im[:,:,2]
colors = set(numpy.unique(packed.ravel()))
colors.remove(255<<16 | 255<<8 | 255)

for color in colors:
py, px = numpy.where(packed == color)
print(px.min(), py.min(), px.max(), py.max())

顺便说一下,我还建议在找到边界框之前移除小的连通分量。

关于python - 在图像中查找 RGB 颜色的边界框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14538168/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com