OpenCV中的图像分割用于颜色分析

5

我正在处理一个需要我完成以下任务的项目:

查看包含相对清晰对象的图像,例如:

enter image description here

并挑选出某个空间中(无论是RGB、HSV还是其他什么)n个最突出的对象的颜色,并返回它们。

我正在研究如何将这样的图像分割成独立的对象。一旦完成了这个步骤,我认为找到各个部分的轮廓并分析它们的平均或重心颜色等不会特别困难...

我简要地研究了Watershed算法,它似乎可以工作,但我不确定如何为不确定数量的斑点生成标记图像。

最好的方法是如何分割这样的图像?如果使用Watershed算法,生成相应的整数标记图像的最佳方法是什么?

2个回答

8

1
我不是专家,但我真的不明白Watershed算法如何对您的分割问题非常有用。
从我的有限经验/接触这种问题来看,我认为应该尝试使用滑动窗口方法进行分割。基本上,这需要使用固定大小的窗口遍历图像,并尝试确定窗口是否包含背景与对象。您将要尝试不同的窗口大小和步骤。
这样做应该允许您检测图像中的对象,假设图像包含相对清晰的对象。您还可以尝试在将图像转换为黑白色并使用某个阈值使背景与对象分离后执行分割。
一旦通过滑动窗口识别出对象,您可以尝试使用您提到的方法之一确定最突出的颜色。
更新
根据您的评论,这里是另一个可能适合您的方法:
如果您认为对象将具有大多数均匀颜色,则可以尝试处理图像以:
1. 去除噪声; 2. 将原始图像映射到减少的颜色空间(即256或16种颜色); 3. 基于像素颜色检测连接的组件并确定哪些组件足够大。
你可能会从重新采样图像以降低分辨率中受益(例如,如果图像为1024 x 768,则可以将其减小为256 x 192),以帮助加快算法的速度。
唯一剩下的事情就是确定哪个组件是背景。这时,通过将图像转换为具有特定阈值的黑/白色来尝试进行背景去除也是有意义的。

我的预期方法是通过某种方式按颜色对对象进行分割,然后对它们进行分割以确保移除任何重叠部分,即确保没有“斑点”相接触。最后,将图像阈值化以将所有对象与背景分离,找到轮廓,然后在原始图像上循环遍历轮廓以找到某个空间中的平均颜色。这可能不是最好的方法。即使我写下来,它似乎非常冗长! - TonyRo
减少颜色空间并搜索区域 - rotating_image
你会推荐哪种减少色彩空间的方法呢?我认为这个方法有其优点,但是将图像降到灰度可能会导致信息损失过大,即多种颜色在0-255范围内变得太相似了。有没有关于减少色彩空间和搜索区域方法的好教程? - TonyRo
我建议使用黑/白(2位)而不是灰度(通常为8或12位)。区别在于2位基本上是图像的布尔开/关表示,将较亮和较暗的区域分开。它可以在某些图像中非常有效地检测感兴趣的区域。另外,就表面信息损失而言,降维也可以非常有效。 对你而言似乎是信息损失的东西,实际上可能非常有助于你实际的目标——检测对象/颜色。 - Mike Dinescu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接