基于matlab的K-means聚类图像分割

1 原理

K-means聚类算法在图像分割中的应用是基于一种无监督的学习方法,它将图像中的像素点或特征区域划分为K个不同的簇或类别。以下是K-means聚类算法用于图像分割的原理,包括步骤和公式:

1.1 原理概述

  1. 选择簇的数量(K)
    • 首先,用户需要指定要将图像数据分成多少个簇(即K的值)。
  2. 初始化聚类中心
    • 随机选择K个像素点作为初始聚类中心。
  3. 分配数据点到最近的聚类中心
    • 对于图像中的每个像素点,计算其与每个聚类中心的距离(如欧氏距离),并将其分配给距离最近的聚类中心所在的簇。
  4. 更新聚类中心
    • 对于每个簇,计算该簇中所有像素点的平均值(或质心),并将这个平均值作为新的聚类中心。
  5. 重复迭代
    • 重复步骤3和步骤4,直到聚类中心不再发生显著变化或达到预定的迭代次数。

1.2 公式表示

  • 距离计算(以欧氏距离为例):

        设eq?x_i为图像中的一个像素点(或特征向量),eq?%5Cmu_j为第j个聚类中心,则像素点eq?x_i到聚类中心eq?%5Cmu_j的欧氏距离计算公式为:

eq?d%28x_i%2C%20%5Cmu_j%29%20%3D%20%5Csqrt%7B%5Csum_%7Bd%3D1%7D%7BD%7D%20%28x_i%7B%28d%29%7D%20-%20%5Cmu_j%7B%28d%29%7D%292%7D

其中,D是像素点或特征向量的维度。

  • 聚类中心的更新
    • 对于每个簇eq?C_k,其新的聚类中心eq?%5Cmu_k%27计算公式为:

eq?%5Cmu_k%27%20%3D%20%5Cfrac%7B1%7D%7B%7CC_k%7C%7D%20%5Csum_%7Bx_i%20%5Cin%20C_k%7D%20x_i

  • 其中,eq?%7CC_k%7C是簇eq?C_k中像素点的数量。

1.3 步骤总结

  1. 初始化:选择K个初始聚类中心。
  2. 分配:计算每个像素点到聚类中心的距离,并将其分配给最近的聚类中心。
  3. 更新:重新计算每个簇的聚类中心。
  4. 迭代:重复步骤2和步骤3,直到聚类中心不再变化或达到预设的迭代次数。

1.4 注意事项

  • K-means算法对初始聚类中心的选择敏感,因此可能多次运行算法并选择最佳结果。
  • SSE(Sum of Squared Errors)是衡量聚类效果的一个指标,其值越小表示聚类结果越紧密。
  • 图像分割中的K-means算法通常是在图像的特征空间(如颜色空间、纹理空间等)上进行的,而不是直接在像素值上进行。这有助于提高算法的鲁棒性和效率。

2 代码

%% 基于聚类的分割 (使用K-means聚类)
figure('Position', [100 100 1200 400]);
% 读取图像并转换为双精度  
I3 = imread('test.jpg');
I3 = rgb2gray(I3);  
subplot(1,3,1);imshow(I3);
title('origin Image');
% 读取图像并转换为双精度  
I4 = imread('test.jpg'); 
I_double = im2double(I4);  
% 将图像数据重塑为二维数组,其中每一列是一个像素  
data = reshape(I_double, [], 3);  
% 使用K-means聚类  
[cluster_idx, cluster_center] = kmeans(data, 3); % 假设我们想要3个聚类  
% 将聚类结果重塑为图像大小  
segmented_image = reshape(cluster_idx, size(I4, 1), size(I4, 2));  
% 显示结果(可能需要为每个聚类分配一个颜色)  
segmented_image_colored = label2rgb(segmented_image, 'jet', 'k', 'shuffle'); 

subplot(1,3,2);imshow(segmented_image_colored); 
title('three colors Image using K-means Clustering');
% 读取图像并转换为灰度  
I5 = imread('test.jpg');  
I_gray = rgb2gray(I5);  
I_double = im2double(I_gray);  
  
% 将图像数据重塑为二维数组  
data = I_double(:);  
  
% 使用两个中心的K-means聚类  
[cluster_idx, cluster_center] = kmeans(data, 2);  
  
% 将聚类结果重塑为图像大小  
segmented_image = reshape(cluster_idx, size(I_gray));  
  
% 为每个聚类分配一个颜色(在这种情况下,0为黑色,1为白色)  
segmented_image_bw = ind2rgb(segmented_image, [0 0 0; 1 1 1]);  

% 显示结果   
subplot(1,3,3);imshow(segmented_image_bw);  
title('Black and White Image using K-means Clustering');

3 运行结果

edf8c6701a0247d7b1c9bf4878addb2b.jpeg

图1 图像分割对比图

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值