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]
istersen yapılmışı var;
http://www.mathworks.com/matlabcentral/fileexchange/8379-kmeans-image-segmentation (http://www.mathworks.com/matlabcentral/fileexchange/8379-kmeans-image-segmentation)
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]
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
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...
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.
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.
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))