如何获得用于二值化图像的k-means算法的阈值?

时间:2017-08-14 21:10:48

标签: matlab k-means

我应用了k-means算法来分割图像。我使用内置的k-means函数。它工作正常,但我想知道在k-means方法中将其转换为二进制图像的阈值。例如,我们可以通过在MATLAB中使用内置函数来获取阈值:

threshold=graythresh(grayscaledImage);
a=im2bw(a,threshold);
%Applying k-means....
imdata=reshape(grayscaledImage,[],1);
imdata=double(imdata);
[imdx mn]=kmeans(imdata,2);
imIdx=reshape(imdx,size(grayscaledImage));
imshow(imIdx,[]);

2 个答案:

答案 0 :(得分:3)

实际上,k-means和众所周知的Otsu基于全局阈值二值化强度图像的阈值有一个有趣的关系:

http://www-cs.engr.ccny.cuny.edu/~wolberg/cs470/doc/Otsu-KMeansHIS09.pdf

可以证明k-means是与Otsu相同的目标函数的局部最优迭代解,其中Otsu是一个全局最优的非迭代解。

根据灰度强度数据,可以根据otsu计算阈值,可以使用graythreshotsuthresh在MATLAB中表示,具体取决于您喜欢的接口。

A = imread('cameraman.tif');
A = im2double(A);
totsu = otsuthresh(histcounts(A,10000))
[~,c] = kmeans(A(:),2,'Replicates',10);
tkmeans = mean(c)

你可以通过找到两个质心的中点来获得kmeans的灰度阈值,这两个质心的中点在几何上是有意义的,因为在那个中点的任一侧,你更接近于一个质心或另一个,因此应该说谎在那个相应的集群中。

totsu =

    0.3308


tkmeans =

    0.3472

答案 1 :(得分:0)

由于kmeans算法中没有阈值,因此无法获得阈值。

K-means是一种聚类算法,它返回的聚类在很多情况下无法通过简单的阈值处理获得。

请参阅this link,了解k-means的工作原理。