www.pudn.com > ACA_FCM.rar > ACA_FCM.m
function ACA_FCM
%The input image should have square size
%All parameters are set to be exactly same as that of the paper
%Image Loading
filename = 'flower';
img = double(imread([filename '.jpg']));
figure(1)
imshow(img/255);
[nrow, ncol, channel] = size(img);
R=img(:, :, 1);
G=img(:, :, 2);
B=img(:, :, 3);
%将彩色图像转化成灰度图像
intensity_img=zeros(nrow, ncol);
for rr = 1 : nrow
for cc = 1 : ncol
intensity_img(rr, cc)=(((R(rr, cc)).^2+(G(rr, cc)).^2+(B(rr, cc)).^2).^0.5)/(3.^0.5);
end
end
figure(2)
imshow(intensity_img/255);
%使用canny算子进行边缘检测
edge_img = edge(intensity_img, 'canny');
figure(3)
imshow(edge_img);
%average = mean(mean(img))/255;
%参数设置
alpha=0.40;
beta=3;
num=0;%监督聚类中心的初始数目,初始化为0
statistic=60;
radius=90;% 聚类半径
lumda=0.40;
rho=0.95;
p1=1;
p2=1;
p3=1;
d=50;
%ACA图像分割程序
%初始化带有分类信息的图像矩阵
cluster_img = zeros(nrow, ncol, 4);
for rr=1:nrow
for cc=1:ncol
cluster_img(rr, cc, 1) = img(rr, cc, 1);
cluster_img(rr, cc, 2) = img(rr, cc, 2);
cluster_img(rr, cc, 3) = img(rr, cc, 3);
cluster_img(rr, cc, 4) = 0;
end
end
%初始化蚂蚁归类操作矩阵
ant_matrix=zeros(rr, cc, 1);
for rr=1:nrow
for cc=1:ncol
if ant_matrix(rr, cc, 1) == 0
ant_matrix(rr, cc, 1) = 2;%ant_matrix(rr, cc, 1)代表该蚂蚁的状态,"0"表示未被归类,"1"表示已经被归类,"2"表示等待被归类, "3"表示在本次循环中成为类, "4"表示该点为边缘像素点
end
end
end
for rr = 1 : nrow
for cc = 1 : ncol
if edge_img(rr, cc)==1
ant_matrix(rr, cc, 1) = 4;%划分为边缘像素点
cluster_img(rr, cc, 1)=255;
cluster_img(rr, cc, 2)=255;
cluster_img(rr, cc, 3)=255;%边缘像素全部设为白色;
end
end
end
%初始化监督聚类中心
%对图像颜色进行统计
color_statistic = zeros(1331, 5);%color_statistic(i, 1)存储像素数目,
%color_statistic(i, 2)、color_statistic(i, 3)、color_statistic(i, 4)分别存储颜色的三个分量,color_statistic(i, 5)存储是否被作为监督聚类中心的信息
for rr = 1 : nrow
for cc = 1 : ncol
%对每个颜色分量进行分段处理
if R(rr, cc) < 12.75
x=1;
elseif R(rr, cc) >= 12.75 & R(rr, cc) < 38.25
x=2;
elseif R(rr, cc) >= 38.25 & R(rr, cc) < 63.75
x=3;
elseif R(rr, cc) >= 63.75 & R(rr, cc) < 89.25
x=4;
elseif R(rr, cc) >= 89.25 & R(rr, cc) < 114.75
x=5;
elseif R(rr, cc) >= 114.75 & R(rr, cc) < 140.25
x=6;
elseif R(rr, cc) >= 140.25 & R(rr, cc) < 165.75
x=7;
elseif R(rr, cc) >= 165.75 & R(rr, cc) < 191.25
x=8;
elseif R(rr, cc) >= 191.25 & R(rr, cc) < 216.75
x=9;
elseif R(rr, cc) >= 216.75 & R(rr, cc) < 241.25
x=10;
elseif R(rr, cc) >= 241.25
x=11;
end
if G(rr, cc) < 12.75
y=1;
elseif G(rr, cc) >= 12.75 & G(rr, cc) < 38.25
y=2;
elseif G(rr, cc) >= 38.25 & G(rr, cc) < 63.75
y=3;
elseif G(rr, cc) >= 63.75 & G(rr, cc) < 89.25
y=4;
elseif G(rr, cc) >= 89.25 & G(rr, cc) < 114.75
y=5;
elseif G(rr, cc) >= 114.75 & G(rr, cc) < 140.25
y=6;
elseif G(rr, cc) >= 140.25 & G(rr, cc) < 165.75
y=7;
elseif G(rr, cc) >= 165.75 & G(rr, cc) < 191.25
y=8;
elseif G(rr, cc) >= 191.25 & G(rr, cc) < 216.75
y=9;
elseif G(rr, cc) >= 216.75 & G(rr, cc) < 241.25
y=10;
elseif G(rr, cc) >= 241.25
y=11;
end
if B(rr, cc) < 12.75
z=1;
elseif B(rr, cc) >= 12.75 & B(rr, cc) < 38.25
z=2;
elseif B(rr, cc) >= 38.25 & B(rr, cc) < 63.75
z=3;
elseif B(rr, cc) >= 63.75 & B(rr, cc) < 89.25
z=4;
elseif B(rr, cc) >= 89.25 & B(rr, cc) < 114.75
z=5;
elseif B(rr, cc) >= 114.75 & B(rr, cc) < 140.25
z=6;
elseif B(rr, cc) >= 140.25 & B(rr, cc) < 165.75
z=7;
elseif B(rr, cc) >= 165.75 & B(rr, cc) < 191.25
z=8;
elseif B(rr, cc) >= 191.25 & B(rr, cc) < 216.75
z=9;
elseif B(rr, cc) >= 216.75 & B(rr, cc) < 241.25
z=10;
elseif B(rr, cc) >= 241.25
z=11;
end
%更新统计信息
color_statistic(((x-1)*121+(y-1)*11+z), 2) = (color_statistic(((x-1)*121+(y-1)*11+z), 2) * color_statistic(((x-1)*121+(y-1)*11+z), 1) + R(rr, cc)) / (color_statistic(((x-1)*121+(y-1)*11+z), 1) + 1);
color_statistic(((x-1)*121+(y-1)*11+z), 3) = (color_statistic(((x-1)*121+(y-1)*11+z), 3) * color_statistic(((x-1)*121+(y-1)*11+z), 1) + G(rr, cc)) / (color_statistic(((x-1)*121+(y-1)*11+z), 1) + 1);
color_statistic(((x-1)*121+(y-1)*11+z), 4) = (color_statistic(((x-1)*121+(y-1)*11+z), 4) * color_statistic(((x-1)*121+(y-1)*11+z), 1) + B(rr, cc)) / (color_statistic(((x-1)*121+(y-1)*11+z), 1) + 1);
color_statistic(((x-1)*121+(y-1)*11+z), 1) = color_statistic(((x-1)*121+(y-1)*11+z), 1) + 1;
end
end
for i = 1 : 1331
if color_statistic(i, 1) >= statistic
num = num +1;%确定监督聚类中心的数目
color_statistic(i, 5) = 1;
end
end
center_ACA=zeros(num, 5);
for i=1 : num
for j = 1 : 1331
if (color_statistic(j, 1) >= statistic) & (color_statistic(j, 5)==1)
center_ACA(i, 1) = color_statistic(j, 2);
center_ACA(i, 2) = color_statistic(j, 3);
center_ACA(i, 3) = color_statistic(j, 4);
color_statistic(j, 5) = 0;%已被作为监督聚类中心
center_ACA(i, 5)=1;%center_ACA(i, 4)用于储存该类具有的像素数,初始化为0,center_ACA(i, 5)用于储存该类具有的信息素浓度
break
end
end
end
ant_info = zeros (num, 5);
%ant_info((r-1)*ncol+c, 1) 储存到该点的距离;ant_info((r-1)*ncol+c, 2) 储存该点的信息素;ant_info((r-1)*ncol+c,3) 储存到该点的启发函数
%ant_info((r-1)*ncol+c, 4) 储存到该点的概率;ant_info((r-1)*ncol+c, 5)储存类别
%主程序
sum_ph=0;%概率公式的分母
do=0;%判断主程序是否应继续循环
do2=1;%判断类合并程序是否应继续循环
judge=zeros(nrow, ncol);%判断该类是否与别的类可以合并的矩阵
n=0;%判断ACA主程序循环次数
m=0;%判断类合并程序循环次数
while (do<=500)
%像素点聚类
for rr = 1 : nrow
for cc = 1 : ncol
if ant_matrix(rr, cc, 1)==0
ant_matrix(rr, cc, 1) = 2;%将前一个循环里未被归类的蚂蚁状态都改为待聚类
end
end
end
for rr = 1 : nrow
for cc = 1 : ncol
%计算像素(rr, cc)到各聚类中心的距离、信息素等多项信息
if ant_matrix(rr, cc, 1)==2
ant_info = zeros(num, 6);
sum_ph=0;
for i = 1 : num
ant_info(i, 1) = sqrt(p1 * (R(rr, cc) - center_ACA(i, 1)).^2 + p2 * (G(rr, cc) - center_ACA(i, 2)).^2 + p3 * (B(rr, cc) - center_ACA(i, 3)).^2);
ant_info(i, 2) = center_ACA(i, 5);
ant_info(i, 3)=radius/(ant_info(i, 1)+0.00001);%保证距离为0的时候,启发函数很大但不为无穷。
sum_ph = sum_ph + ant_info(i, 2).^alpha + ant_info(i, 3).^beta;
ant_info(i, 5) = i;
end
%计算到各聚类中心的概率
for i=1:num
ant_info(i, 4) = (ant_info(i, 2).^alpha + ant_info(i, 3).^beta)/sum_ph;
end
rand('state', sum(100*clock));
temp = find(cumsum(ant_info(:, 4)) >= rand(1), 1);
%路径的概率选择计算
if ant_info(temp, 4) >= lumda
ant_matrix(rr, cc, 1) = 1;%该像素已经被归类
cluster_img(rr, cc, 4) = temp;%记录该像素的类别
center_ACA(temp, 4) = center_ACA(temp, 4) + 1;%该聚类中包含的像素数加1
if ant_info(temp, 1) <= radius
center_ACA(temp, 5) = center_ACA(temp, 5) + 1;%若距离小于radius,则信息素加1
end
else
ant_matrix(rr, cc, 1) = 0;%像素未被归类,状态变为0
end
end
end
end
%更新聚类中心信息
for i = 1 : num
if ~(center_ACA(i, 4)==0)
sum1=0;
sum2=0;
sum3=0;
for rr = 1 : nrow
for cc = 1 : ncol
if cluster_img(rr, cc, 4)==i
sum1 = sum1 + cluster_img(rr, cc, 1);
sum2 = sum2 + cluster_img(rr, cc, 2);
sum3 = sum3 + cluster_img(rr, cc, 3);
end
end
end
center_ACA(i, 1) = sum1 / center_ACA(i, 4);
center_ACA(i, 2) = sum2 / center_ACA(i, 4);
center_ACA(i, 3) = sum3 / center_ACA(i, 4);
end
end
%类间合并
%初始化判断矩阵
while(do2==1)
judge=zeros(num, 1);
for i = 1 : num
if ~(center_ACA(i, 4)==0)
judge(i, 1)=1;
end
end
for i = 1 : num
if ~(center_ACA(i, 4)==0)
cluster_info = zeros(num, 2);%记录类间距离
temp=[d; 0];%第一个记录上次的距离值,第二个记录类别
for j = 1 : num
if (~(j==i))&(~(center_ACA(j, 4)==0))
cluster_info(j, 1) = sqrt((center_ACA(i, 1) - center_ACA(j, 1)).^2 + (center_ACA(i, 2) - center_ACA(j, 2)).^2 + (center_ACA(i, 3) - center_ACA(j, 3)).^2);
cluster_info(j, 2) = j;
end
end
for j = 1 : num
if cluster_info(j, 1)=e)
for i = 1 : C
sum_subjection1 = 0;
sum_subjection2 = 0;
sum_subjection3 = 0;
sum_subjection=0;
for rr = 1 : nrow
for cc = 1 : ncol
if ~(ant_matrix(rr, cc, 1)==4)
sum_subjection1 = sum_subjection1 + (subjection(rr, cc, i).^m) * R(rr, cc);
sum_subjection2 = sum_subjection2 + (subjection(rr, cc, i).^m) * G(rr, cc);
sum_subjection3 = sum_subjection3 + (subjection(rr, cc, i).^m) * B(rr, cc);
sum_subjection = sum_subjection + subjection(rr, cc, i).^m;
end
end
end
center_FCM(i, 1) = sum_subjection1/sum_subjection;
center_FCM(i, 2) = sum_subjection2/sum_subjection;
center_FCM(i, 3) = sum_subjection3/sum_subjection;
end
for rr = 1 : nrow
for cc = 1 : ncol
for i = 1 : C
subjection_temp(rr, cc, i) = subjection(rr, cc, i);
end
end
end
%隶属度矩阵计算
for rr = 1 : nrow
for cc = 1 : ncol
if ~(ant_matrix(rr, cc, 1)==4)
for i = 1 : C
distance(i, 1) = sqrt((R(rr, cc)-center_FCM(i, 1)).^2 + (G(rr, cc)-center_FCM(i, 2)).^2 + (B(rr, cc)-center_FCM(i, 3)).^2);
end
do = 1;
for i = 1 : C
if distance(i, 1) == 0
subjection(rr, cc, i) = 1;%若某个像素到聚类中心的距离为0,则其隶属度为1
for j = 1 : C
if ~(j==i)
subjection(rr, cc, j) = 0;
do = 0;
end
end
end
break
end
if do == 1
for i = 1 : C
sum_distance = 0;
for j = 1 : C
sum_distance = sum_distance + (distance(i, 1)/distance(j, 1)).^(2/(m-1));
end
subjection(rr, cc, i) = 1 / sum_distance;
end
end
end
end
end
%距离和计算
sum_d = 0;
for rr = 1 : nrow
for cc = 1 : ncol
for i = 1 : C
sum_d = sum_d + (subjection(rr, cc, i) - subjection_temp(rr, cc, i)).^2;
end
end
end
sum_d
end
%带有分类信息的图像矩阵
cluster_img2 = zeros(nrow, ncol, 4);
for rr = 1 : nrow
for cc = 1 : ncol
if ~(ant_matrix(rr, cc, 1)==4)
temp = max(subjection(rr, cc, :));
for i = 1 : C
if subjection(rr, cc, i) == temp
cluster_img2(rr, cc, 1) = center_FCM(i, 1);
cluster_img2(rr, cc, 2) = center_FCM(i, 2);
cluster_img2(rr, cc, 3) = center_FCM(i, 3);
cluster_img2(rr, cc, 4) = i;
end
end
elseif ant_matrix(rr, cc, 1)==4
cluster_img2(rr, cc, 1) = 255;
cluster_img2(rr, cc, 2) = 255;
cluster_img2(rr, cc, 3) = 255;
end
end
end
center_FCM
%cluster_img2(:, :, 4)
imwrite(cluster_img2(:, :, 1:3)./255, 'Result2.bmp', 'bmp');