2017-08-14 144 views
0

我应用k-means算法分割图像。我使用内置的k-means函数。它工作正常,但我想知道的阈值,将其转换为K均值方法的二进制图像。例如,我们可以通过使用内置的功能的MATLAB得到阈值:如何获得用于二值化图像的k均值算法的阈值?

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

是什么让你认为在应用k-means之前将值进行二值化? – beaker

+0

不,我在应用k-means之前没有进行二值化。我分别使用了k-means零件。 –

+0

k-means中没有二值化。 – beaker

回答

2

实际上,k均值和用于基于全局阈值二值化强度图像的公知的大津的阈值有一个有趣的关系:

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

可以示出的是K-装置的一个局部最优迭代求解与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) 

您可以通过只找到两个质,这将使意义几何,因为在该中点两侧的中点获得k均值灰度阈值时,你更接近重心或其它之一,因此应该位于相应的集群中。

totsu = 

    0.3308 


tkmeans = 

    0.3472 
+0

谢谢。其实我想这种类型的答案。 –

0

你不能得到的门槛,因为在k均值算法没有门槛。 K-means是一种聚类算法,它返回在很多情况下无法用简单的阈值获得的聚类。

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

+0

当k = 2时,对于强度图像信息,可以通过取kmeans返回的两个集群质心位置的均值来获得阈值。 –

+0

@Alex正确!很好的答案。 – Ratbert