我一直在尝试这样做:
http://prntscr.com/umv66 - > http://goo.gl/Bgmv2(你可以忽略红线,我只是添加它们来说明最终目标)
所以,我在第一个案例中所做的是:使用MatLab,我转换了rgb - > hsv并选择了s频道(a.k.a饱和度)。然后我使用Otsu(在matlab中称为graythresh)来二值化并转换成黑白图片。一切都很完美。
现在,在第二种情况下,这不能很好地运作:
Base img(http://goo.gl/OtK4G) - > S频道(http://goo.gl/oo8h6) - > Otsu(http://goo.gl/cnfxU)
如您所见,在这种情况下,Otsu过滤器变得无用。我应该采取任何解决方法或其他方式吗?提前谢谢!
答案 0 :(得分:1)
您可以使用k-means执行图像量化。因此,您知道必须将图像二值化,使黄色阴影变为白色,其他一切变为黑色。因此,将您的图像划分为适当数量的聚类(4可能有效)。 2为黄色阴影,2为其他阴影。不要忘记预定义初始质心。在此之后,您可以说,标记为黄色质心的像素被重新标记为一个。这可能有用。
k-means颜色量化过程的细节:
1.首先在nx3
矩阵中收集图像中的所有像素。然后使用k-means将nx3
矩阵分成3或4个簇。
2.在将其潜入4个星团之前,预定义质心。您可以通过阅读MATLAB kmeans算法here的文档来完成此操作。您必须设置的参数是kmeans的'options'字段中的'start'。
因此,黄色(以及与其“接近”的其他颜色)应落入预定义的簇中。 (因此,如果您将群集1和2定义为黄色,则应将所有黄色像素标记为1或2.其他像素将标记为3或4.)
4.现在,将图像转换为二进制,使得落入黄色簇的像素(即本例中的簇1和2)应为1,其他为零。
有关预定义集群的更多详细信息:
来自kmeans文档:
可以在start
kmeans
参数中将起始质心定义为质心起始位置的k-by-p
矩阵。在您的情况下,它将是黄色的RGB
值。查看图像中存在的黄色的几个像素值。如果它们有太多偏差,则为它们定义两个簇,否则为一个簇。如果您定义了两个,则start
参数将具有2x3
矩阵。您应该始终记住,centroid中的列数将等于数据中的列数。
我希望这会让这个过程更加清晰。如果您有任何错误,请发布您的代码。