-1

我一直在尝试这样做:

http://prntscr.com/umv66 -> http://goo.gl/Bgmv2(你可以忽略红线,我只是添加它们来说明最终目标)

所以,我在第一种情况下所做的是:使用 MatLab,我转换了 rgb -> hsv 并拾取了 s 通道(又名饱和度)。然后我使用Otsu(在matlab中称为graythresh)进行二值化并转换成黑白图片。一切都很完美。

现在,在第二种情况下,这不太好用:

基础img( http://goo.gl/OtK4G ) ->S频道( http://goo.gl/oo8h6)->Otsu(http://goo.gl/cnfxU )

如您所见,在这种情况下,Otsu 过滤器变得毫无用处。我应该采取任何解决方法或其他方式吗?提前致谢!

4

1 回答 1

1

您可以使用 k-means 执行图像量化。所以你知道你必须以这样一种方式对图像进行二值化,使黄色阴影变成白色,而其他一切都变成黑色。因此,将您的图像分成合适数量的集群(4 个可能有效)。2 用于黄色色调,2 用于其他色调。不要忘记预定义初始质心。在此之后,您可以说,被标记为黄色质心的像素被重新标记为一个。这可能会奏效。

k-means 颜色量化过程的细节: 1. 首先将图像中的所有像素收集在一个nx3矩阵中。然后使用 k-means 将nx3矩阵划分为 3 或 4 个簇。2. 在将其划分为 4 个集群之前,预定义质心。您可以通过在此处阅读 MATLAB kmeans 算法的文档来做到这一点. 您必须设置的参数是 kmeans 的 'options' 字段中的 'start'。3. 所以黄色(和其他“接近”它的颜色)应该属于预定义的集群。(因此,如果您为黄色定义了集群 1 和 2,那么您应该将所有黄色像素标记为 1 或 2。其他像素将标记为 3 或 4。) 4. 现在,将图像转换为二进制,这样像素落入黄色簇(即本例中的簇 1 和 2),应设为 1,其他将为零。

有关预定义集群的更多详细信息:来自 kmeans 文档:起始质心可以在start参数中定义为质心起始位置kmeansk-by-p矩阵。在您的情况下,它将是RGB黄色的值。查看图像中存在的黄色的一些像素值。如果它们的偏差太大,则为它们定义两个集群,否则为一个。如果您定义两个,那么您的start参数将具有2x3矩阵。您应该始终记住,质心中的列数将等于数据中的列数。

我希望这可以在更高的层次上使过程更加清晰。如果您有任何错误,请发布您的代码。

于 2013-03-01T20:14:30.640 回答