我正在使用页面分割算法。代码的输出写入一个图像,每个区域的像素都分配了唯一的颜色。我想处理图像以找到区域的边界框。我需要找到所有颜色,然后找到该颜色的所有像素,然后找到它们的边界框。
以下是示例图像。
我目前从 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,
输出:
(数组([ 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 narray 展平为 24 位打包 RGB 值 (r<||
最佳答案
没有理由将其视为 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/