我应用了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,[]);
答案 0 :(得分:3)
实际上,k-means和众所周知的Otsu基于全局阈值二值化强度图像的阈值有一个有趣的关系:
http://www-cs.engr.ccny.cuny.edu/~wolberg/cs470/doc/Otsu-KMeansHIS09.pdf
可以证明k-means是与Otsu相同的目标函数的局部最优迭代解,其中Otsu是一个全局最优的非迭代解。
根据灰度强度数据,可以根据otsu计算阈值,可以使用graythresh或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
答案 1 :(得分:0)