mahsava
شنبه 27 دی 1393, 22:54 عصر
یک کد قطعه بندی تصویر با استفاده از خوشه بندی (الگوریتم k-means) دارم. اما وقتی اون رو بر روی تصویر (خاکستری) اعمال می کنم، خطا میده که اندیس باید عدد صحیح مثبت یا عدد منطقی باشه.
حالا من نمی دونم باید کد رو چطور اصلاح کنم که این خطا رفع بشه و برنامه درست کار کنه. کسی می تونه کمکم کنه؟ درضمن گویا این کد خیلی معروفه و زیاد ازش استفاده می کنن.
این هم کدش:
function [mu,mask]=kmeans(ima,k)% check image
%ima=imread('Robat.jpg');
% greyLevels=2^8-1; % Number of gray levels
% ima=round(greyLevels*ima/max(ima));
ima=double(ima);
copy=ima; % make a copy
ima=ima(:); % vectorize ima (colunm)
mi=min(ima); % deal with negative
ima=ima-mi+1; % and zero values (sefr va manfi ro az beyn mibare)
%k=6;
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
حالا من نمی دونم باید کد رو چطور اصلاح کنم که این خطا رفع بشه و برنامه درست کار کنه. کسی می تونه کمکم کنه؟ درضمن گویا این کد خیلی معروفه و زیاد ازش استفاده می کنن.
این هم کدش:
function [mu,mask]=kmeans(ima,k)% check image
%ima=imread('Robat.jpg');
% greyLevels=2^8-1; % Number of gray levels
% ima=round(greyLevels*ima/max(ima));
ima=double(ima);
copy=ima; % make a copy
ima=ima(:); % vectorize ima (colunm)
mi=min(ima); % deal with negative
ima=ima-mi+1; % and zero values (sefr va manfi ro az beyn mibare)
%k=6;
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