PFCM聚类算法实现图像的二值化

近期一直在做相关聚类的课题,FCM,K-means 算法在网上和书籍等非常常见。PFCM算法只给出了部分数据集的测试效果,对于其在图像中的应用似乎没找到,而且关于PFCM的介绍类帖子也非常少。所以自己写了一个相关的的图像聚类算法造福下大家。
    首先介绍下PFCM吧,,这里对参考了原始论文的表述方式。

在这里插入图片描述
附上论文链接吧
Pal NR, Pal K, Keller JM, Bezdek JC. A possibilistic fuzzy c-means clustering algorithm. IEEE Transactions on Fuzzy Systems 2005;13(4):517–30.

然后直接上代码,但是本人写的代码存在一些问题,复杂度比较高,建议输入图像的尺寸不大于100*100否则得运行很长时间。若有大神帮忙修改,不胜感激。

clc
clear;
close all;


img=imread('123.jpg');
img=rgb2gray(img);  %%这里注意图像是否为二维的,要转灰度图,如果本身是二维的一定要删除这一行
img=double(img);
subplot(1,2,1),imshow(img,[]);
data=img(:);


cluster_n = 2;%类别数  ,修改聚类的数量,二值化即为2
iter = 20;%迭代次数
m = 2;%指数
b = 2;
p = 0.5;
q = 0.5;
K = 1;

num_data = size(data,1);%样本个数
num_d = size(data,2);%样本维度
%--初始化隶属度u,条件是每一列和为1
U = rand(cluster_n,num_data);
col_sum = sum(U);
U = U./col_sum(ones(cluster_n,1),:);
%--初始化隶属度t
T = rand(cluster_n,num_data);
col_sum = sum(T);
%T = T./col_sum(ones(cluster_n,1),:);
%% 循环--规定迭代次数作为结束条件
for i = 1:iter
    %更新c,r
    for j = 1:cluster_n
        for k = 1:num_data
            u_ij_m = U(j,:).^m;
            sum_u_ij = sum(u_ij_m);
            sum_1d = u_ij_m./sum_u_ij; 
            t_ij_b = T(j,:).^b;
            sum_t_ij = sum(t_ij_b);
            sum_2d = t_ij_b./sum_t_ij;
            ut_ij_m = U(j,:).^m + T(j,:).^p;
            sum_ut_ij = sum(ut_ij_m);
            sum_d = ut_ij_m./sum_ut_ij; 
            c(j,:) = ut_ij_m*data./sum_ut_ij;
            r(j,:) = K*ut_ij_m*(norm(data(k,:)-c(j,:)))^2./sum_ut_ij;    
        end
    end
    %-计算目标函数J
    temp1 = zeros(cluster_n,num_data);
    for j = 1:cluster_n
        for k = 1:num_data
            temp1(j,k) = (p*U(j,k)^m+q*T(j,k)^b)*(norm(data(k,:)-c(j,:)))^2;
        end
    end
    J1(i) = sum(sum(temp1));
    temp2 = zeros(cluster_n,num_data);
    for j = 1:cluster_n
        for k = 1:num_data
            temp2(j,k) = (1-U(j,k))^b;
        end
        temp2(j,k) = r(j,k)* temp2(j,k);
    end
    J2(i) = sum(sum(temp2));
    J(i) = J1(i) +J2(i);
    %更新U
    for j = 1:cluster_n
        for k = 1:num_data
            sum1 = 0;
            for j1 = 1:cluster_n
                temp = (norm(data(k,:)-c(j,:))/norm(data(k,:)-c(j1,:))).^(2/(m-1));
                sum1 = sum1 + temp;
            end
            T(j,k) = 1./(1+(q*((norm(data(k,:)-c(j,:))).^2)./r(j,k)).^(1/(b-1)));
            U(j,k) = 1./sum1;
        end
    end
end

 [~,label] = max(U); %找到所属的类


img_new=reshape(label,size(img));  %label为返回各元素归为哪类,若属于第一类则颜色为灰度1的,若属于第二类则颜色为灰度2的

subplot(1,2,2)
imshow(img_new,[]);

效果图展示:
在这里插入图片描述在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_42666791/article/details/107553861