2016-04-14 36 views
0

Matlab 2015a örneğinde olduğu gibi, kmean kümeleme kullanarak renkleri nasıl segmentlere ayıracağımı öğreniyorum. Ama kodları her çalıştırdığımda, istediğim renkler farklı kümeler halinde. Örneğin, ilk çalıştırma için, sarı kümenin 1 ve mavi kümenin 2 olduğunu gösterir. Tekrar çalıştırdığımda, farklı kümelere geçerler. Tekrar ve tekrar çalıştırsam bile sarı ve mavi, belirli kümelerde nasıl yapılır? Lütfen bana yardım et. Benim durumda kmean renk segmentasyonu neden her seferinde farklı renk gösteriyor?

[FileName,PathName] = uigetfile('*.jpg','Select the MATLAB code file'); 

he1= imread(FileName); 
cform = makecform('srgb2lab'); 
lab_he = applycform(he1,cform); 
figure (2) 
imshow (lab_he) 


ab = double(lab_he(:,:,2:3)); 
nrows = size(ab,1); 
ncols = size(ab,2); 
ab = reshape(ab,nrows*ncols,2); 

nColors = 3; 
% repeat the clustering 3 times to avoid local minima 
[cluster_idx, cluster_center] = kmeans(ab,nColors,'distance','sqEuclidean',   ... 
            'Replicates',3); 



pixel_labels = reshape(cluster_idx,nrows,ncols); 
figure (3) 
imshow(pixel_labels,[]), title('image labeled by cluster index'); 

segmented_images = cell(1,3); 
rgb_label = repmat(pixel_labels,[1 1 3]); 

for k = 1:nColors 
    color = he1; 
    color(rgb_label ~= k) = 0; 
    segmented_images{k} = color; 
end 
%% 
figure (4) 
imshow(segmented_images{1}), title('objects in cluster 1'); 

%% 
figure (5) 
imshow(segmented_images{2}), title('objects in cluster 2'); 

%% 
figure (6) 
imshow(segmented_images{3}), title('objects in cluster 3'); 
%% 
a = im2bw (segmented_images{2},0.05); 
figure (7) 
imshow (a); 

b = im2bw (segmented_images{3},0.05); 
figure (8) 
imshow (b); 

, sarı renk ile bölge kümede 2 olmalıdır ve göstermek Lütfen mavi bölge ile bölge kümede 3. olmalıdır: Şimdiden teşekkürler

Bu i kullanmak kodudur ben nasıl yapmalıyım

cevap

1

kmeans'un ilk çıktısı kümenin dizini dizinindedir ve bir renk değildir. Gösterdiğiniz renk, onu görselleştirdiğinizde MATLAB tarafından görüntülenen renktir.

Kmeans ile, başlangıç ​​küme merkezleri giriş verilerinden rasgele seçilir. Bu nedenle siparişi rastgele. Bu şekilde, hangi küme endeksine bir piksele atanırsa, algoritmayı her aradığınızda farklı olacaktır, ancak bir küme içerisindeki pikseller aynı kümeye yerleştirilmeli ve birbiri ardına gelen aramalar ilebirbirinin aynı küme indeksine sahip olmalıdır.

Her bir kümeye karşılık gelen gerçek rengi istiyorsanız, küme endeksini bir renge eşlemek için kmeans (küme yüzdeleri) second output'u kullanmak isteyeceksiniz. Bunu ind2rgb kullanarak kolayca yapabilirsiniz. sadece ardışık aramalar sonrasında aynı kalması küme endeksi değerlerine istiyorsanız

pixel_labels = ind2rgb(cluster_idx, cluster_center); 
imshow(pixel_labels) 

, size belirli bir istiyorsanız bu değiştirilebilir

[cluster_idx, cluster_center] = kmeans(ab, nColors); 
[~, ind] = sortrows(cluster_center); 

pixel_labels = reshape(cluster_idx, nrows, ncols); 

for k = 1:numel(ind) 
    pixel_labels(cluster_idx == k) = ind(k); 
end 

tutarlı indeks belirlenmesini sağlamak için cluster_center kullanabilirsiniz Belirli bir kümede olmak için renk.

%// Define yellow 
yellow = [1 1 0]; 

%// Define blue 
blue = [0 0 1]; 

%// Find the centroid closest to yellow 
[~, yellowind] = min(sum(bsxfun(@minus, cluster_center, yellow).^2, 2)); 

%// Find the one closest to blue 
[~, blueind] = min(sum(bsxfun(@minus, cluster_center, blue).^2, 2)); 

%// Now assign them to clusters with yellow as 2 and blue as 3 
segmented_images{1} = cluster_idx == setdiff(1:3, [yellowind, blueind]); 
segmented_images{2} = cluster_idx == yellowind; 
segmented_images{3} = cluster_idx == blueind; 
+0

Üzgünüm efendim, bunun nasıl çalıştığını bana açıklar mısınız? –

+0

@badrulhisham Cevabınızı – Suever

+0

daha net hale getirme umuduyla güncelledim, yardımınız için çok teşekkür ederim efendim, ben bunları rahatsız etmek için özür dilerim kodumu –