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

How to get the threshold value of k-means algorithm that is used to binarize the images?

我应用了 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,[]);

kmeans算法中没有阈值,所以无法得到阈值。

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

请参阅 this link 以进一步了解 k-means 的工作原理。

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

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

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

给定灰度强度数据,可以根据 otsu 计算阈值,可以使用 graythresh, or otsuthresh 在 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