【发布时间】:2020-12-21 16:20:55
【问题描述】:
我正在使用 Python(没有 AI,只有经典工具)处理一个 CV 项目,但遇到了一个问题。
我正在尝试从已知 ROI 中检测手部和皮肤颜色,该 ROI 手部位于白色背景上(因为它使用网络摄像头,所以颜色可能不准确 - 例如,灰色对我来说可能被视为白色)。我试着做一个颜色的直方图,从那里我会提取手的颜色。
为了获得我使用Image.getcolors(width*height) 的颜色列表,并将其放入直方图中。不幸的是,我得到了一个巨大的颜色列表,其中很多颜色与其他颜色相似(例如,(255,0,0)和(255,0,1)在单独的箱中表示)(由于相机质量差、照明等)。我的问题是如何合并这些箱并获得一个可靠的直方图,我可以从中提取肤色。
这是我写的一些代码:
pilRoi = Image.fromarray(coloredRoi)
w,h = pilRoi.size
colorsInRoi = pilRoi.getcolors(w*h)
sortedColors = sorted(colorsInRoi, key=lambda tup: tup[0])[::-1]
用于对颜色进行排序。 并且:
for idx, color in enumerate(sortedColors):
if(idx<config.NUM_COLORS):
plt.bar(idx, color[0], color=helper.toHex(color[1]),edgecolor=helper.toHex(color[1]))
else:
break
plt.show()
用于直方图。 我确实尝试删除白色范围像素的总和,问题仍然存在于其他颜色:
for color in sortedColors:
if isInWhiteRange(color[1]) or color[1] == config.BLUE:
toRemove.append(color)
for color in toRemove:
sortedColors.remove(color)
谢谢!
【问题讨论】:
-
处理此问题的一种方法是在获取直方图之前将图像缩小到小尺寸(例如 50x50)。如果仍然有太多颜色,则使用 -kmeans num_colors 限制颜色数量,例如 256 种颜色或更少。
-
看起来像是对颜色进行聚类,然后取聚类中心可能更适合您所描述的问题。看看tberg.dk/post/determining-dominant-colors
标签: python opencv image-processing computer-vision histogram