动态地计算轮廓内的颜色阈值

时间:2017-10-23 13:29:36

标签: python opencv image-processing

我有一个由3种颜色组成的输入图像。这些颜色是圆形的并且是嵌套的。

图像类似于: https://www.google.ie/search?q=red+yellow+blue+nested+circles&client=ms-unknown&tbm=isch&tbs=rimg:CbQTsOKsM7yhIkCaDOdJHzqnN2Xk-DhItFHm0Zqt6wMB32Tm1CzyzQ7wrXERbVqngEyMBzO57J8UuHLak9WPqWfjV7kgvdJ47BJlKhIJmgznSR86pzcR8SW2ldYWlqIqEgll5Pg4SLRR5hG-6WlMFrVBvioSCdGaresDAd9kEVFfCyyB-AgqKhIJ5tQs8s0O8K0RT790ELynuK8qEglxEW1ap4BMjBHBPar4Jd2NtioSCQczueyfFLhyEY7iP_13IGcsOKhIJ2pPVj6ln41cRTMOWeqZE5oYqEgm5IL3SeOwSZREray5kAy-dzw%3D%3D&tbo=u&ved=0ahUKEwjWzfSC6IbXAhXFbBoKHW3GBrUQuIIBCCM#imgrc=5tQs8s0O8K32hM

我将使用这样的几个图像。图像始终是相同的。但是对于不同的相机,照明,甚至打印机的差异,实际的颜色可能会有所不同。因为它会在showen中显示为红黄绿色。通过使用HSV和阈值,我可以轻松确定每种颜色的上限值和下限值。但是,如果我更改为不同的图像集,则这些值不再起作用。

我克服这个问题的想法是首先在图像中寻找轮廓。 对于每个轮廓,我想得到一个上限和下限。使用canny,gaussian和contours的组合,我能够在测试中绘制每种颜色周围的轮廓,这似乎足够通用。

我被困住的地方是从轮廓内获取阈值。这可能吗?或者是否有更简单的逻辑我想要实现这个目标?

目前我正在使用python,但语言是次要的。

1 个答案:

答案 0 :(得分:1)

忘记轮廓,他们会使事情变得更加困难。

更好的方法是使用k-means对像素进行分类。使用至少三个簇进行初始化,以绿色,黄色,红色为中心。也许一个以白色为中心,为背景。

收敛后,你应该有准确的颜色和分割。

https://en.wikipedia.org/wiki/K-means_clustering#Standard_algorithm