Bunu yapabilecek var mı ?

Başlatan Deli_Nedym, 10 Nisan 2013, 21:31:26

Deli_Nedym

Arkadaşlar merhaba. Matlabte görüntü işleme ile ilgilenen arkadaşlar bana yardımcı olabilirse çok minnettar kalırım.
İstediğiniz bir programlama dili kullanarak matlabtaki k-means kümeleme yöntemi ile imge bölütleme kodu yazınız.
Programın başında K değişkeniyle kaç küme oluşturacağımızı biz kendimiz belirleyeceğiz. Daha sonraki mantık, piksel hangi kümeye daha yakınsa o kümenin merkezine aittir. RGB kullanmak gerekiyor sanırım. Piksellerin RGB'sine göre o kümelerle arasındaki mesafe ölçülüp hangi küme merkezine ait olduğunu bulmak gerekiyor. İlk başta küme merkezlerini biz elle belirieyebiliriz diye düşündüm ginput komutuyla. Gerisinde yardımcı olabilecek arkadaşlar varsa yardımlarını bekliyorum. Şimdiden teşekkür ederim. Kolay gelsin iyi çalışmalar herkese...

[IMG]http://i50.tinypic.com/2qk31ck.png[/img]



Deli_Nedym

#2
Kodları görebilmek için üye olmak gerekiyor sanırım ? Sen üyeysen koda bakıp buraya yazabilir misin hocam ? Sanırım bana lazım olan şey gerçektende bu  :)
Tabi sonra kodu anlayabilecek miyim ne kadar kompleks bi şey bakmak gerek :)

mesaj birleştirme:: 10 Nisan 2013, 22:06:26

Bende de algoritması var aslında ama...
[IMG]http://i47.tinypic.com/35hjr6g.png[/img]

atioky_216

function [mu,mask]=kmeans(ima,k)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%   kmeans image segmentation
%
%   Input:
%          ima: grey color image
%          k: Number of classes
%   Output:
%          mu: vector of class means 
%          mask: clasification image mask
%
%   Author: Jose Vicente Manjon Herrera
%    Email: jmanjon@fis.upv.es
%     Date: 27-08-2005
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% check image
ima=double(ima);
copy=ima;         % make a copy
ima=ima(:);       % vectorize ima
mi=min(ima);      % deal with negative 
ima=ima-mi+1;     % and zero values

s=length(ima);

% create image histogram

m=max(ima)+1;
h=zeros(1,m);
hc=zeros(1,m);

for i=1:s
  if(ima(i)>0) h(ima(i))=h(ima(i))+1;end;
end
ind=find(h);
hl=length(ind);

% initiate centroids

mu=(1:k)*m/(k+1);

% start process

while(true)
  
  oldmu=mu;
  % current classification  
 
  for i=1:hl
      c=abs(ind(i)-mu);
      cc=find(c==min(c));
      hc(ind(i))=cc(1);
  end
  
  %recalculation of means  
  
  for i=1:k, 
      a=find(hc==i);
      mu(i)=sum(a.*h(a))/sum(h(a));
  end
  
  if(mu==oldmu) break;end;
  
end

% calculate mask
s=size(copy);
mask=zeros(s);
for i=1:s(1),
for j=1:s(2),
  c=abs(copy(i,j)-mu);
  a=find(c==min(c));  
  mask(i,j)=a(1);
end
end

mu=mu+mi-1;   % recover real range

Deli_Nedym

Teşekkürler kod için ama matlabte çalıştırdığımda yaklaşık 5 dk busy oldu ve hâlâ da sonuç vermemişti. Bende görev yöneticisinden kapattım en sonunda.
Ayrıca sanırım bu sadece gri renkli görüntüler için (ima: grey color image)  , ama bana içinde çokça renk olan görüntülerde de kullanılacak bi kod gerekli...

Deli_Nedym

k -means algoritması bilgisayar programına uygulanırken aşağıdaki adımlar izlenir:
1. Küme sayısı ( k ) okunur. Bu değer algoritmaya dışarıdan verilir.
2. k adet rastgele veya belirli bir yöntemle küme merkezleri belirlenir.
3. Tüm elemanların merkezlere olan uzaklıkları hesaplanır.
4. Elemanlar yakın oldukları merkezlere göre kümelenir.
5. Dördüncü adımda oluşan kümelerin ortalamaları hesaplanarak yeni küme merkezleri belirlenir.
6. Son bulunan küme merkezleri bir önceki küme merkezlerine eşit oluncaya ya da belirlenen döngü sayısına ulaşılana kadar işlem tekrarlanır.

Deli_Nedym

Arkadaşlar mesela m=[1 1 1 1 1 1  ; 2 2 2 2 2 2  ; 3 3 3 3 3 3] şeklinde bir matrisim var. Ben bu matrisin içinde sadece 1,2,3 değerlerinin olduğunu nasıl bulurum ? Bunları da bir değişkene atamam gerekiyor.

Deli_Nedym

Cevabı da benden olsun.
K kaç farklı ton istediğinizi, t döngüsü de kaç kez bu işlemi tekrarlamanızı soruyor. Daha net sonuç almak için yüksek seçmek gerek. tic toc zaten süre ölçümü biliyorsunuz.
clear all; close all; clc
k=20;
imshow('deneme.jpg');
l=double(imread('deneme.jpg'));

m =  uint8(ginput(k));

tic

[N1 N2 N3 ] = size(l);

map=zeros(N1,N2);
pk_uzun = zeros( 1,k );

for i=1:k
    kcenter(i,:) = l ( m(i),m(i,2), : )
end
 

for t=1:50

    for i=1:N1
        for j=1:N2 

                for o=1:k
       pk_uzun( o ) = sqrt(   (  ( l(i,j,1)- kcenter(o,1) )^2 + ( l(i,j,2)- kcenter(o,2) )^2 + ( l(i,j,3)- kcenter(o,3) )^2  )   )  ;
                end

r = find( pk_uzun(:) == min(  pk_uzun ) );
map( i,j ) = r(1);
    
        end
    end

   red = zeros(1,k);
   green = zeros(1,k);
   blue = zeros( 1,k );
   counter = zeros(1,k);

for i=1:N1
    for j=1:N2

        red( map(i,j) ) = red( map(i,j) ) + l(i,j,1);
        green( map(i,j) ) = green( map(i,j) ) + l(i,j,2);
        blue( map(i,j) ) = blue( map(i,j) ) + l(i,j,3);
        counter( map(i,j) ) = counter( map(i,j) ) + 1;
    end
end

for p=1:k 
    kcenter(p,1) = red( p ) / counter( p );
    kcenter(p,2) = green( p ) / counter( p );
    kcenter(p,3) = blue( p ) / counter( p );
   
end

end

for i=1:N1
    for j=1:N2

        l( i,j,1 ) = kcenter( map(i,j), 1  );
        l( i,j,2 ) = kcenter( map(i,j), 2  );
        l( i,j,3 ) = kcenter( map(i,j), 3  );

    end
end
toc
imshow(uint8(l))