文档视界 最新最全的文档下载
当前位置:文档视界 › 彩色图像分割

彩色图像分割

file_name = input ('请输入图像文件路径:','s');
请输入图像文件路径:'f:3.jpg';
>> I_rgb = imread( 'f:3.jpg' );
>> I_rgb =im2double(rgb); % 双精度
R=I_rgb(:,:,1);
G=I_rgb(:,:,2);
B=I_rgb(:,:,3);
[M, N] = size(R);
s = M*N;
T = 0.008856;
RGB = [reshape(R,1,s); reshape(G,1,s);reshape(B,1,s);)];
MAT = [0.412453 0.357580 0.180423;0.212671 0.715160 0.072 MAT = [0.412453 0.357580 0.180423;0.212671 0.715160 0.072 MAT = [0.412453 0.357580 0.180423;0.212671 0.715160 0.072 MAT = [0.412453 0.357580 0.180423;0.212671 0.715160 0.072 MAT = [0.412453 0.357580 0.180423;0.212671 0.715160 0.072 MAT = [0.412453 0.357580 0.180423;0.212671 0.715160 0.072 MAT = [0.412453 0.357580 0.180423;0.212671 0.715160 0.072 169;0.019334 0.119193 169;0.019334 0.119193 169;0.019334 0.119193 0.950227];
XYZ = MAT * RGB;
X = XYZ(1,:) / 0.950456;
Y = XYZ(2,:);
Z = XYZ(3,:) / 1.088754;
XT = X > T;
YT = Y > T;
ZT = Z > T;
fX = XT .* X.^(1/3) + (~XT) (7.787 X 16/116);
Y3 = Y.^(1/3);
fY = YT .* Y3 + (~YT) (7.787 . * Y + 16/116);
L = YT .* (116 * Y3 - 16.0) + (~YT) .* (903.3 * Y);
fZ = ZT .* Z.^(1/3) + (~ZT) (7.787 Z 16/116);
a = 500 * (fX - fY);
b = 200 * (fY - fZ);
L = reshape(L, M, N);
a = reshape(a, M, N);
b = reshape(b, M, N);
aa=reshape(a,M*N,1);% >> aa=reshape(a,M*N,1);% 转换成一维 数组,需在二计算欧式距离所以没必要转为换成一维 数组,需在二计算欧式距离所以没必要转为换成一维 数组,需在二计算欧式距离所以没必要转为换成一维 数组,需在二计算欧式距离所以没必要转为换成一维 数组,需在二计算欧式距离所以没必要转为换成一维 数组,需在二计算欧式距离所以没必要转为换成一维 数组,需在二计算欧式距离所以没必要转为换成一维 数组,需在二计算欧式距离所以没必要转为换成一维 数组,需在二计算欧式距离所以没必要转为换成一维 数组,需在二计算欧式距离所以没必要转为换成一维 数组,需在二计算欧式距离所以没必要转为换成一维 数组,需在二计算欧式距离所以没必要转为换成一维 数组,需在二计算欧式距离所以没必要转为换成一维 数组,需在二计算欧式距离所以没必要转为换成一维 数组,需在二计算欧式距离所以没必要转为空间
bb=reshape(b,M*N,1);
A=[aa bb];
[n,p]=size(A);
k=3;
center=ones(k,p+1);
A(:,p+1)=0; %A 多出来一列存储数据
for i=1:k
center(i,:)=A(i,:); %选择 A的前三个作为聚类中心
end
old=center;% 存储旧的聚类中心,与之后做比较
for i=1:n
for j=1:k
dist(i,j)=sum((A(i,:) -center(j,:)).^2);
end
[m,ind]=min(dist(i,:));
A(i,p+1)=ind;% 存储下标
end
counter11=0;
counter12=0;
counter13=0; % 计算每个聚类中心有多少元素
for i=1:M*N
if A(i,p+1)==1
counter11=counter11+1;
center(1,:)=A(i,:)+center(1,:);
end
if A(i,p+1)==2
counter12=counter12+1;
center(2,:)=A(i,:)+2,:);
end
if

A(i,p+1)==3
counter13=counter13+1;
center(3,:)=A(i,:)+3,:); % 属于一个聚类中心的数据进行叠加,
end
end
center(1,:)=1,:)/counter11;
center(2,:)=2,:)/counter12; % 属于一个聚类中心
的数据,重新计算center(3,:)=3,:)/counter13;
for w=1: 15 %最大迭代次数为 15 次
for i=1:3
error=sum((center(i,:) -old(i,:)).^2);% 计算迭代误差
end
if error<0.000001
break;
else
for t=1:n
for j=1:k
dist(t,j)=sqrt(sum((A(t,:) -center(j,:)).^2));
end
[m,ind]=min(dist(t,:));
A(t,p+1)=ind;% 存储下标
end
counter21=0;
counter22=0;
counter23=0;
for i=1 :M*N
if A(i,p+1)==1
counter21=counter21+1;
center(1,:)=A(i,:)+1,:);
end
if A(i,p+1)==2
counter22=counter22+1;
center(2,:)=A(i,:)+2,:);
end
if A(i,p+1)==3
counter23=counter23+1;
center(3,:)=A(i,:)+3,:);
end
end
center(1,:)=1,:)/counter21;
center(2,:)=2,:)/counter22;
center(3,:)=3,:)/counter23;
end
end
A1=A; %% 显示结果
A2=A;
A3=A;
A4=A;
A5=A;
A6=A;
for k=1:M*N
if A1(k,p+1)~=1
A1(k,1:2)=1; % 0 背景用黑色表示。 1背景用白色
end
end
A1=reshape(A1(:,1),M,N);%a 列
for k=1:M*N
if A2(k,p+1)~=2
A2(k,1:2)=1;
end
end
A2=reshape(A2(:,1),M,N);
for k=1:M*N
if A3(k,p+1)~=3
A3(k,1:2)=1;
end
end
A3=reshape(A3(:,1),M,N);
for k=1:M*N
if A4(k,p+1)~=1
A4(k,1:2)=1;
end
end
A4=reshape(A4(:,2),M,N);
for k=1:M*N
if A5(k,p+1)~=2
A5(k,1:2)=1;
end
end
A5=reshape(A5(:, 2),M,N);
for k=1:M*N
if A6(k,p+1)~=3
A6(k,1:2)=1;
end
end
A6=reshape(A6(:,2),M,N);
R1=I_rgb(:,:,1);
G1=I_rgb(:,:,2);
B1=I_rgb(:,:,3);
R1=A1;
G1=A1;
B1=A1;
C1=cat(3,R 1,G 1,B 1);
W1=I_rgb;
for k=1:3
for i=1:M
for j=1:N
if C 1(i,j,k)==1
W1(i,j,k)=C 1(i,j,k);
end
end
end
end
subplot(1,3,1) ; imshow(W 1); title('分割区域一'); >> R 2=I_rgb(:,:,1);
G2=I_rgb(:,:,2);
B2=I_rgb(:,:,3);
R2=A2;
G2=A2;
B2=A2;
C2=cat(3,R 2,G 2,B 2);
W2=I_rgb;
for k=1:3
for i=1:M
for j=1:N
if C 2(i,j,k)==1
W2(i,j,k)=C 2(i,j,k);
end
end
end
end
subplot(1,3,2) ; imshow(W 2); title('分割区域二');
R 3=I_rgb(:,:,1);
G3=I_rgb(:,:,2);
B3=I_rgb(:,:,3);
R3=A3;
G3=A3;
B3=A3;
C3=cat(3,R 3,G 3,B 3);
W3=I_rgb;
for k=1:3
for i=1:M
for j=1:N
if C 3(i,j,k)==1
W3(i,j,k)=C 3(i,j,k);
end
end
end
end
subplot(1,3,3) ; imshow(W 3) ; title('分割区域三');
该出现用于将分割结果显示在一幅图像中:
W= I_rgb;
for k=1:3
for i=1:M
for j=1:N
if C 1(i,j,k) ~=1
W(i,j,k)= 0;
end
if C2(i,j,k) ~=1
W(i,j,k)= 0.5 ;
end
if C3(i,j,k) ~=1
W(i,j,k)= 1;
end
end
end
end
imshow(w)

相关文档