我正在研究检测皮肤血肿的项目。从RGB转换为HSV后,我遇到颜色问题。我的算法通过颜色检测血肿。
对于一些图像,我在这里有很好的结果:
原创img:http://imgur.com/WHiOWdj 结果img:http://imgur.com/PujbnHa
但是有些图像我的结果很糟糕:
原创img:http://imgur.com/OshB99r 结果img:http://imgur.com/CuNzAId
转换为HSV后的同一原始图像:http://imgur.com/lkVwtCs
你有任何想法如何解决它?
由于
答案 0 :(得分:2)
查看结果图像我认为您只在算法中使用原始图像的H通道。假阳性检测可以继承,健康皮肤的某些部分具有与血肿相同的H值。您可以在H通道的qrey-scale图像上看到两个部分具有相似的值:
两部分之间的差异是饱和度值。在下图中,您可以看到原始图像的S通道,它完美地显示在血肿处饱和度远高于手臂其他部位:
这是预期的,因为血肿的颜色比健康的皮肤强得多。
所以,我建议你在你的算法中同时使用H和S通道你必须只考虑S图像包含高饱和度值的H图像部分。这样做的一个可能而简单的解决方案是对H和S图像进行二值化,并使用AND操作执行此过滤:
二值化后的H图像: 二进制化后的 S图像: H& S操作后的图像: 您可以看到结果图像上只有血肿部分是白色的(除了一些噪声,但您可以轻松消除,例如通过大小或形态滤波)。
修改
重要的是要注意,二值化是对象检测算法中最重要的(有时也是非常复杂的)步骤之一,即二值化是要检测的对象的第一个亮点。
如果外部条件(照明,物体颜色等)在图像之间没有显着变化,您可以使用修复双重阈值。如果无法发布这种恒定的环境,则必须使用更复杂的方法。您可以使用很多可能性,在这里您可以阅读一些示例:
基于直方图分析的几种解决方案:在具有对象的直方图上,总是有更多的局部最大值,这些位置可以根据环境而变化,如果找到它们,您可以轻松地调整二值化阈值。
例如,原始图像的H通道的直方图如下: 第一个最大值属于背景,第二个属于皮肤,最后一个属于血液。可以假设这些3个阈值可以在每个图像中找到,只是它们的位置取决于照明或其他条件。要在第2和第3局部最大值之间设置阈值,可以选择突出血细胞。
最后,我向您介绍OpenCV中关于阈值处理的以下内容: OpenCV - Thresholding