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

Moh*_*sin 0 matlab k-means

我应用 k 均值算法来分割图像。我使用内置的 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,[]);
Run Code Online (Sandbox Code Playgroud)

Ale*_*lor 6

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

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

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

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

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

您可以通过找到两个质心的中点来从 kmeans 获得灰度阈值,这在几何上应该是有意义的,因为在该中点的任一侧,您更接近其中一个质心或另一个质心,因此应该位于各自的位置簇。

totsu =

    0.3308


tkmeans =

    0.3472
Run Code Online (Sandbox Code Playgroud)