function imgq=colorquanti(img,L)
[H,W,c]=size(img);
img=double(img);
q=256/L;
for i=1:L
for j=1:L
for k=1:L
g{i,j,k}=[(i-1)*q+(q-1)/2,(j-1)*q+(q-1)/2,(k-1)*q+(q-1)/2];
end
end
end
G{L,L,L}=[];
for i=1:H
for j=1:W
Red=img(i,j,1);
Gre=img(i,j,2);
Blu=img(i,j,3);
f{W*(i-1)+j}=[Red,Gre,Blu];
P{W*(i-1)+j}=[floor(Red/q)+1,floor(Gre/q)+1,floor(Blu/q)+1];
G{floor(Red/q)+1,floor(Gre/q)+1,floor(Blu/q)+1}=[G{floor(Red/q)+1,floor(Gre/q)+1,floor(Blu/q)+1};Red,Gre,Blu];
end
end
while true
sign=0;
for i=1:L
for j=1:L
for k=1:L
if isempty(G{i,j,k})~=1
[m,n]=size(G{i,j,k});
g{i,j,k}=sum(G{i,j,k},1)./m;
end
end
end
end
for i=1:H
for j=1:W
x=P{W*(i-1)+j}(1);
y=P{W*(i-1)+j}(2);
z=P{W*(i-1)+j}(3);
d(W*(i-1)+j)=distan(f{W*(i-1)+j},g{x,y,z});
db=ones(L,L,L)*255;
for Rx=-1:2:1
for Ry=-1:2:1
for Rz=-1:2:1
if (x+Rx)>0&&(x+Rx)<=L&&(y+Ry)>0&&(y+Ry)<=L&&(z+Rz)>0&&(z+Rz)<=L
db(x+Rx,y+Ry,z+Rz)=distan(f{W*(i-1)+j},g{x+Rx,y+Ry,z+Rz});
end
end
end
end
if min(min(min(db)))<d(W*(i-1)+j)
sign=1;
[x1,y1]=find(db==min(min(min(db))));
z1=ceil(y1/L);
y1=mod(y1,L);
if y1==0
y1=L;
end
P{W*(i-1)+j}=[x1,y1,z1];
G{x1,y1,z1}=[G{x1,y1,z1};img(i,j,1),img(i,j,2),img(i,j,3)];
[m,n]=size(G{x,y,z});
for k=1:m
if G{x,y,z}(k,:)==f{W*(i-1)+j};
G{x,y,z}(k,:)=[];
break;
end
end
end
end
end
if sign==1
continue;
else
break;
end
end
imgq=zeros(H,W,c);
for i=1:H
for j=1:W
x=P{W*(i-1)+j}(1);
y=P{W*(i-1)+j}(2);
z=P{W*(i-1)+j}(3);
imgq(i,j,1)=g{x,y,z}(1);
imgq(i,j,2)=g{x,y,z}(2);
imgq(i,j,3)=g{x,y,z}(3);
end
end
imgq=uint8(imgq);
评论0