01 Aralık 2021, 17:55:24

Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H


Bunu yapabilecek var mı ?

Başlatan Deli_Nedym, 11 Nisan 2013, 00:31:26

Deli_Nedym

11 Nisan 2013, 00:31:26 Son düzenlenme: 11 Nisan 2013, 00:39:27 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...





Deli_Nedym

11 Nisan 2013, 01:04:39 #2 Son düzenlenme: 11 Nisan 2013, 01:06:26 Deli_Nedym
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:: 11 Nisan 2013, 01:06:26

Bende de algoritması var aslında ama...

atioky_216

function [mu,mask]=kmeans(ima,k)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%   
kmeans image segmentation
%
%   
Input:
%          
imagrey color image
%          kNumber of classes
%   Output:
%          
muvector of class means 
%          maskclasification image mask
%
%   
AuthorJose Vicente Manjon Herrera
%    Emailjmanjon@fis.upv.es
%     Date27-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)>0h(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 allclose allclc
k
=20;
imshow('deneme.jpg');
l=double(imread('deneme.jpg'));

=  uint8(ginput(k));

tic

[N1 N2 N3 ] = size(l);

map=zeros(N1,N2);
pk_uzun zeros1,);

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

for t=1:50

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

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

findpk_uzun(:) == min(  pk_uzun ) );
mapi,) = r(1);
    
        
end
    end

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

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

        red
map(i,j) ) = redmap(i,j) ) + l(i,j,1);
        
greenmap(i,j) ) = greenmap(i,j) ) + l(i,j,2);
        
bluemap(i,j) ) = bluemap(i,j) ) + l(i,j,3);
        
countermap(i,j) ) = countermap(i,j) ) + 1;
    
end
end

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

end

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

        l
i,j,) = kcentermap(i,j), 1  );
        
li,j,) = kcentermap(i,j), 2  );
        
li,j,) = kcentermap(i,j), 3  );

    
end
end
toc
imshow
(uint8(l))

Yasal Uyarı: Picproje.org sitemizde 5651 sayılı kanunun 8. maddesine ve T.C.Knın 125. maddesine göre tüm üyelerimiz yaptıkları paylaşımlardan kendileri sorumludur. Picproje.org hakkında yapılacak tüm hukuksal şikayetleri İletişim sayfamızdan bize bildirdikten en geç 3 (üç) iş günü içerisinde ilgili kanunlar ve yönetmelikler çerçevesinde tarafımızca incelenerek gereken işlemler yapılacak ve site yöneticilerimiz tarafından bilgi verilecektir.