一、基于 FCM 的图像分割(调用 FCM 函数)
clc
clear all
I=imread('14.jpg');
figure,imshow(I)
I2=rgb2gray(I);
figure,imshow(I2)
I3=reshape(I2,10000,1);
I4=im2double(I3);
[center,U,obj_fcn]=fcm(I4,2);
z1=center(1,:);z2=center(2,:);
for i=1:10000
%分别计算每个样本到个聚类中心的欧式距离
%并按最近邻规则聚类
%样本中心稳定,则为最终聚类结果
f1=imsubtract(I4(i,:),z1);
D1(:,i)=sqrt(f1*f1');
f2=imsubtract(I4(i,:),z2);
D2(:,i)=sqrt(f2*f2');
end
D=[D1;D2];
for i=1:10000
if D1(:,i)==min(D(:,i)')
s1(i,:)=zeros(1,1);
else
end
s1(i,:)=ones(1,1);
end
for i=1:10000
if D2(:,i)==min(D(:,i)')
s2(i,:)=zeros(1,1);
s2(i,:)=ones(1,1);
else
end
end
a1=reshape(s1,100,100);
a2=reshape(s2,100,100);
figure,imshow(a1)
figure,imshow(a2)
%样本 S1 组成的图像
%样本 S2 组成的图像
二、基于 HCM 的灰度图像分割
预备知识:
1.K—均值算法(HCM)
依据准则函数进行分类,具体内容:先选择 K 个聚类中心,然后根据聚类准则对 K 个中心
反复修改(用迭代法),直至分类合理。聚类过程中,聚类中心数目不变。属于一种硬分类。
2.模糊 C 均值算法(FCM)
将上述硬分类模糊化,引入隶属度函数,定义聚类损失函数,并使其最小化(用迭代法求
解)。当算法收敛时,可得到各类聚类中心和各个样本对于各类的隶属度值,从而完成模糊
聚类划分。Matlab 自带了 FCM 函数,如下例:
function [center, U, obj_fcn] = FCM(data, cluster_n, options)
% FCM.m 采用模糊 C 均值对数据集 data 聚为 cluster_n 类
% 用法:
% 1. [center,U,obj_fcn] = FCM(Data,N_cluster,options);
% 2. [center,U,obj_fcn] = FCM(Data,N_cluster);
---- nxm 矩阵,表示 n 个样本,每个样本具有 m 的维特征值
---- 标量,表示聚合中心数目,即类别数
---- 4x1 矩阵,其中
options(1): 隶属度矩阵 U 的指数,>1
options(2): 最大迭代次数
options(3): 隶属度最小变化量,迭代终止条件
options(4): 每次迭代是否输出信息标志
(缺省值: 2.0)
(缺省值: 100)
(缺省值: 1e-5)
(缺省值: 1)
% 输入:
% data
% N_cluster
% options
%
%
%
%
% 输出:
% center
% U
% obj_fcn
% Example:
%
%
%
%
%
%
%
%
%
%
%
---- 聚类中心
---- 隶属度矩阵
---- 目标函数值
data = rand(100,2);
[center,U,obj_fcn] = FCM(data,2);
plot(data(:,1), data(:,2),'o');
hold on;
maxU = max(U);
index1 = find(U(1,:) == maxU);
index2 = find(U(2,:) == maxU);
line(data(index1,1),data(index1,2),'marker','*','color','g');
line(data(index2,1),data(index2,2),'marker','*','color','r');
plot([center([1 2],1)],[center([1 2],2)],'*','color','k')
hold off;
3.图像分割
基本原理:根据图像的组成结构和应用需求将图像划分为若干个互不相交的子区域的过程。
这些子区域四某种意义下具有共同属性的像素的连通集合。常用方法有:
1) 以区域为对象进行分割,以相似性原则作为分割的依据,即可根据图像的灰度、色彩、
变换关系等方面的特征相似来划分图像的子区域,并将各像素划归到相应物体或区域的
像素聚类方法,即区域法;
2) 以物体边界为对象进行分割,通过直接确定区域间的边界来实现分割;
3) 先检测边缘像素,再将边缘像素连接起来构成边界形成分割。
本课题要求采用聚类算法进行图像分割,即将样本像素归为两类(目标和背景),并以
0 或 1 来分别赋阈值,处理结果类似于二值化。
图像分割结果:
1 基于 HCM 的图像分割
clc;
clear;
I=imread('14.jpg');
%真彩变灰度
figure,imshow(I) %原始图像
I2=rgb2gray(I);
figure,imshow(I2) %灰度图像
I3=reshape(I2,10000,1);
I4=im2double(I3);
k=2;
z1=I4(2000,:);z2=I4(7000,:);
%任意确定二个聚类中心
for i=1:10000
%分别计算每个样本到个聚类中心的欧式距离
f1=imsubtract(I4(i,:),z1);
D1(:,i)=sqrt(f1*f1');
f2=imsubtract(I4(i,:),z2);
D2(:,i)=sqrt(f2*f2');
end
D=[D1;D2];
for i=1:10000
if D1(:,i)==min(D(:,i)')
s1(i,:)=zeros(1,1);
s1(i,:)=ones(1,1);
else
end
end
a1=reshape(s1,100,100);
figure,imshow(a1)
%并按最近邻规则聚类
%样本中心稳定,则为最终聚类结果
图 1 为 RGB 图像;图 2 为灰度图像;图 3 为聚类后的两类样本像素(目标和背景)二
值化的结果
三 、两类分类算法效果比较
1)
2)
3)
基本思路:均采用聚类算法对图像像素进行聚类,然后分别对目标像素和背景
像素赋予 0 或 1 的阈值,图像分割结果类似于二值化处理(目标与背景黑白反
衬);
图像显示结果好坏在于聚类,聚类结果的好坏在于聚类中心的选择。第一种方
法调用了 matlab 自带的 fcm 函数,所确定的聚类中心比较精准,分类效果优于
HCM 算法(主要依据经验和主观判断选择初始聚类中心,相对来说效果较差)。
在编程过程中,在对图像矩阵像素进行聚类之前,建议将矩阵变为列矩阵(用
reshape 命令),这样聚类效果最佳。