- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 Python(没有 AI,只有经典工具)做一个 CV 项目,遇到了一个问题。我正在尝试从手放在白色背景上的已知 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)
谢谢!
最佳答案
通常对于直方图,您将颜色放入 bin。例如,如果您有 256 个强度和 32 个箱,这意味着每个箱的宽度为 4。0-3 范围内的强度集中到第一个箱中,4-7 范围内的强度集中到第二个箱中,依此类推. 这就是正式的统一颜色量化,我们对像素进行量化,使其进入一组预定的 bin 中的一个。
在您的特定情况下,您可以为每个颜色 channel 指定多个 bin,然后您可以简单地计算一维直方图,这样对于每个颜色 channel ,您可以找出它属于该 channel 的哪个 bin,然后转换此序列将 3 个 bin 合并为一个值。我提倡一维直方图的原因是为了更容易计算图像之间的相似性度量。
由于您已经将 NumPy 形式的图像存储在 coloredRoi
中,我假设您已经在三个平面中拥有它,因此 channel 是最后一个维度的 3D 数组。我还假设您正在处理每个 channel 的 8 位无符号整数值。像这样简单的东西可以工作:
# Define number of bins per channel
num_red_bins = 8
num_green_bins = 8
num_blue_bins = 8
# Define threshold per bin
thresh_red = 256 // num_red_bins
thresh_green = 256 // num_green_bins
thresh_blue = 256 // num_blue_bins
# Extract planes
red = coloredRoi[..., 0]
green = coloredRoi[..., 1]
blue = coloredRoi[..., 2]
# Calculate bin number per location
bin_red = red // thresh_red
bin_green = green // thresh_green
bin_blue = blue // thresh_blue
# Calculate 1D bin locations
bins = num_red_bins * num_green_bins * bin_blue + num_green_bins * bin_red + bin_green
# Calculate histogram
histo = np.bincount(bins, minlength=num_red_bins * num_green_bins * num_blue_bins)
该代码非常不言自明,但最后两行可能令人困惑。在此之前,我们已经将 RGB 像素转换为它们在红色、绿色和蓝色 channel 中的 bin 位置。这些集合将为我们提供此像素相对于最终 3D bin 的映射位置。这是一个独特的元组,将映射到 1D 直方图中的单个位置。要计算最终的 1D bin 编号,请考虑红色导航该空间的行,绿色导航该空间的列。假设我们只需要处理红色和绿色,每次我们需要去到红色的新空间时,我们都必须跳 num_green_bins
过去,所以这就是为什么我们有 num_green_bins * bin_red
。每次我们去一个新的绿色空间,我们只需要偏移列,这样我们就可以将 bin_green
添加到 num_green_bins * bin_red + bin_green
。最后,如果我们想要变成蓝色,我们需要为每个我们想要的蓝色空间跳过 num_red_bins * num_green_bins
,因为我们现在要变成 3D,因此我们现在还添加了 num_red_bins * num_green_bins * bin_blue
。然后我们使用 numpy.bincount
根据我们刚刚计算的 1D bins 计算最终的直方图。
现在您有了这个 1D 直方图,您可以使用任何直方图相似性度量来查看您期望从手上看到的颜色分布是否与感兴趣的色 block 相匹配。最后一点,如果您想看看这个量化图像是什么样子,只需取您的 bin 值并将 bin 值乘以我上面概述的每个 bin 的阈值,然后将所有内容叠加到最终图像中。
out_img = np.dstack((thresh_red * bin_red, thresh_green * bin_green, thresh_blue * bin_blue))
numpy.dstack
获取 2D 数组并将它们堆叠在三维中以生成合并的 3D 数组。如果你做对了,当你可视化存储在 out_img
中的量化结果时,颜色的微小变化就会消失。请注意,每个颜色 channel 的 bin 数量是您需要调整的参数。 bin 的数量越多,您获得的颜色就越细粒度,从而增加了您所表示的动态范围,但是使用粒度颜色会以将非常相似的 RGB 像素视为不同为代价。同样,bin 的数量越少,在更广泛的值范围内看起来越相似的颜色,这将使您的分类的判别力变弱。我建议更改 bin 的数量,以便您在反射(reflect)人类肤色(红色/绿色)的 bin 上放置更多夸张,并减少对不反射(reflect)人类肤色(蓝色)的颜色的强调。
关于python - 合并图像直方图的相似容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65396310/
我遇到了一个让我非常难过的问题。但现在看来这一定是一个普遍的问题,我很惊讶我找不到关于它的另一个问题。 基本上,我的网站上会出现一些图标。我希望它们在每台设备上都显示出大致相同的大小——大致是可触摸的
我是一名 Java 专业人士。现在我喜欢转向其他编程语言。谁能建议我哪种编程语言更容易消化,并且该语言具有 Web 开发功能。我对 Web 开发感兴趣。 最佳答案 C# - 网络开发非常好(只需看看这
我需要为不同的 url 发送不同的响应。但是我正在使用的正则表达式不起作用。 有问题的两个正则表达式是 "/v1/users/[^/]+/permissions/domain/HTTP/" (例
让我描述一下我的问题。有一个输入字符串和一个包含数千个字符串的表。我正在寻找搜索与输入字符串最相似* 字符串的最佳方法。搜索应该返回一个包含 ~10 个建议字符串的列表,按相似度排序。字符串在数据库中
我在使用 crypt() 时遇到问题,如果用户有密码(本例中为 password1),并且他们将其更改为 password2,则散列会返回相同的结果。您可以在此处进行测试:旧链接输入 password
我问这个是因为我发现 XML 在视觉上没有吸引力。我知道 XML 非常有名,很有用,而且它被大多数(如果不是全部)程序员接受为一种非常有用的定义和结构化数据的语言;然而,我真的不觉得盯着它看、看着它或
我有工作需要在 14 天内完成。我有5名 worker 。一天正好需要3个 worker 。每个 worker 最多只能工作 9 天。每个 worker 都有自己的日期偏好,每个 worker 每天都
FileStream 或 DB 句柄类型的对象必须正确关闭,因为它在内部使用 Windows 句柄。同样,Threads 也使用 Windows 句柄吧?线程是否有一些内部机制来释放那些 Window
如果这是非常基本的,请原谅。我一直在尝试遍历行数组中的每个单元格包括标题单元格。我可以在 Nokogiri CSS 选择器中使用 OR 运算符吗? thang= Nokogiri::HTML(IO.r
默认情况下,RichTextFx(顶部控件)看起来不像 TextArea(底部控件): 我找到了一种添加圆角的方法(只需从 modena.css 复制并配置 some styles): .virtua
在 64 位 Java 中,每个对象实例往往包含一个 192-bit header , 包含 类指针, 标志和 锁(每个 64 位)。 这可能会导致小对象的大量内存开销。 尼姆的情况是否类似?用两种语
我正在开发一个具有多个功能(通过 tableview 选择)的应用程序,这些功能几乎都做同样的事情,相似的布局、相似的按钮、相似的输入字段等等。但在我相信它们自己的地方有足够的不同类(class)。每
题目地址:https://leetcode-cn.com/problems/similar-rgb-color/ 题目描述 Inthe following, every capital lette
我正在编写 R 代码,我希望它在“非调试”或“调试”模式下运行。在 Debug模式下,我希望代码打印出运行时信息。 在其他语言中,我通常会有某种打印功能,除非打开标志(用于编译或运行时),否则什么都不
我不明白这个OP接受的答案的一部分: Javascript function scoping and hoisting 作者说: " 此外,在这种情况下, function a() {} 行为与相同
我正在做一个bcmp(&v6_addr1,&v6_addr2,sizeof(v6_addr1)) (gdb) p v6_addr2 $15 = {u = {b = "0\001", '\000' ,
我有一个充满按钮的 Canvas,我将其 ID 存储在字典中。 Canvas 很长,带有垂直滚动条。有一种方法可以自动将 View 定位在给定的按钮上吗? 当使用 Text 时,txt.see(pos
我正在尝试使用 Python 2.6 和 PIL 计算两个图像的相似度(读作:Levenshtein 距离)。 我打算给我们e python-levenshtein用于快速比较的库。 主要问题: 什么
换句话说,php $object->method(); 和 $object->property = 'someValue'; 相当于,js: $object.method(); 和 $object.p
我写了一个简单的函数,它接收实现 .index() 的东西和要检查的字符列表。 我的假设是,由于字符串和元组都是不可变的,因此它们具有相似的性能(或者至少,元组的性能优于列表)。相反,元组似乎等同于列
我是一名优秀的程序员,十分优秀!