MATLAB 图像分割代码分析:基于 K-means 聚类算法
这段代码主要使用 K-means 聚类算法对一张名为'fruit.jpg'的图片进行分割,最终得到二值化的图像。具体分析如下:
- 第一行代码用于清空命令窗口、关闭所有图像和清空工作空间变量。
- 第二行代码读取名为'fruit.jpg'的图片,并将其存储在变量 Image 中。
- 第三行代码用 subplot 函数创建一个 2 行 1 列的图像窗口,并在第 1 个子图中显示原图像 Image,设置标题为'原图像'。
- 第四行代码将 RGB 格式的图像 Image 转换为 HSV 格式,并将其存储在变量 hsv 中。
- 第五行代码从 hsv 中获取色调 (hue) 通道,并将其存储在变量 h 中。
- 第六行代码将色调值大于 330/360 的像素值设为 0,即将红色和紫色区域的像素值置为 0。
- 第七行和第八行代码获取 h 的大小,并将其存储在变量 N 和 M 中。
- 第九行代码将 h 中的所有像素值存储在一维数组 training 中。
- 第十行代码设置 kmeans 算法的初始质心,即将 training 中的像素值分为 6 类,每一类的初始质心分别为 0、60/360、120/360、180/360、240/360 和 300/360。
- 第十一行代码使用 kmeans 算法将 training 中的像素值分为 6 类,并返回每个像素所属的类别索引和每个类别的质心。
- 第十二行代码将索引值为 1 的类别的像素值置为 1,其余像素值置为 0,即将分割出的区域用二值化的方式表示。
- 第十三行代码将 idbw 变量的一维数组转换为与 h 相同大小的矩阵 template。
- 第十四行代码用 subplot 函数在第 2 个子图中显示二值化后的图像 template,设置标题为'分割后的图像'。
- 第十五行代码将二值化后的图像 template 存储为名为'clusterseg.jpg' 的文件。
代码示例:
clear, clc, close all;
Image = imread('fruit.jpg');
subplot(121); imshow(Image), title('原图像');
hsv = rgb2hsv(Image);
h = hsv(:,:,1);
h(h > 330/360) = 0;
[N,M] = size(h);
training = h(:);
startdata = [0; 60/360; 120/360; 180/360; 240/360; 300/360];
[IDX,C] = kmeans(training, 6, 'Start', startdata);
idbw = (IDX == 1);
template = reshape(idbw, size(h));
subplot(122); imshow(template), title('分割后的图像');
imwrite(template, 'clusterseg.jpg');
总结:
这段代码展示了如何使用 MATLAB 的 K-means 聚类算法对图片进行分割,并最终得到二值化图像。代码示例涵盖图像读取、颜色空间转换、聚类操作和结果可视化等步骤。
原文地址: https://www.cveoy.top/t/topic/oAoc 著作权归作者所有。请勿转载和采集!