OpenCV HSV 怪异转换

OpenCV HSV weird converted

我正在研究从皮肤检测血肿的项目。从 RGB 转换为 HSV 后,我遇到了颜色问题。我的算法通过颜色检测血肿。

有些图片我得到了不错的结果,如下所示:

原图:http://imgur.com/WHiOWdj 结果图像:http://imgur.com/PujbnHa

但是对于某些图像,我的结果很糟糕:

原图:http://imgur.com/OshB99r 结果 img:http://imgur.com/CuNzAId

转换为 HSV 后的相同原始图像:http://imgur.com/lkVwtCs

你有什么解决办法吗?

谢谢

看你的结果图像,我认为你在你的算法中只使用了原始图像的 H 通道。假阳性检测可以继承健康皮肤的某些部分与血肿具有完全相同的H值。在H通道的qrey-scale图像上可以看到两个部分的值相似:

两部分的区别在于饱和度值。在下图中,您可以看到原始图像的 S 通道,它完美地显示了血肿处的饱和度比手臂其他部位高得多:

这是预料之中的,因为血肿的颜色比健康皮肤的颜色要深得多。

因此,我建议您在算法中同时使用 H 和 S 通道,即 您必须只考虑 H 图像中 S 图像包含高饱和度值的部分.一个可能且简单的解决方案是将 H 和 S 图像二值化,并使用 AND 运算执行此过滤:

二值化后的H图: 二值化后的S图: H&S手术后的图片: 可以看到在结果图上只有血肿部分是白色的(除了一些噪声但是可以很容易的去除,比如通过大小或者形态学过滤)。

编辑

需要注意的是,二值化是对象检测算法中最重要(有时也非常复杂)的步骤之一,即二值化是要检测的对象的第一个亮点。

如果外部条件(照明、物体颜色等)在图像之间没有显着变化,您可以使用固定二元化阈值。如果不能保证这个恒定的环境,你必须使用更复杂的方法。您可以使用很多可能性,在这里您可以阅读一些示例:

几个解决方案基于直方图分析:在带有对象的直方图上,总是有更多的局部最大值,其位置会根据环境而变化,如果找到它们,您可以轻松调整二值化阈值。

例如原图H通道的直方图如下: 第一个最大值属于背景,第二个最大值属于皮肤,最后一个属于血细胞。可以假设这 3 个阈值可以在每个图像中找到,只是它们的位置根据光照或其他条件而变化。要在第 2 个和第 3 个局部最大值之间设置一个阈值,突出显示血红蛋白可能是一个不错的选择。

最后,我建议您阅读以下有关 OpenCV 中的阈值处理的文章: OpenCV - Thresholding