Picproje Elektronik Sitesi

SERBEST BÖLGE => Bilim Teknik => Matlab => Konuyu başlatan: Deli_Nedym - 10 Nisan 2013, 21:31:26

Başlık: Bunu yapabilecek var mı ?
Gönderen: Deli_Nedym - 10 Nisan 2013, 21:31:26
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]

Başlık: Ynt: Bunu yapabilecek var mı ?
Gönderen: berat23 - 10 Nisan 2013, 22:00:29
istersen yapılmışı var;
http://www.mathworks.com/matlabcentral/fileexchange/8379-kmeans-image-segmentation (http://www.mathworks.com/matlabcentral/fileexchange/8379-kmeans-image-segmentation)
Başlık: Ynt: Bunu yapabilecek var mı ?
Gönderen: Deli_Nedym - 10 Nisan 2013, 22:04:39
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]
Başlık: Ynt: Bunu yapabilecek var mı ?
Gönderen: atioky_216 - 11 Nisan 2013, 01:30:14
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
Başlık: Ynt: Bunu yapabilecek var mı ?
Gönderen: Deli_Nedym - 11 Nisan 2013, 06:06:16
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...
Başlık: Ynt: Bunu yapabilecek var mı ?
Gönderen: Deli_Nedym - 12 Nisan 2013, 14:17:56
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.
Başlık: Ynt: Bunu yapabilecek var mı ?
Gönderen: Deli_Nedym - 13 Nisan 2013, 22:30:36
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.
Başlık: Ynt: Bunu yapabilecek var mı ?
Gönderen: Deli_Nedym - 14 Nisan 2013, 23:51:05
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))