1.基于k均值的hsv彩色空间油菜花图像分割
原图
k均值处理之后的效果图
基于k均值hsv彩色空间处理效果图
效果显然可见。
close all;
clear all;
clc;
I_rgb=imread('1.png');%读取一张RGB彩图,此时也可以的当成数据矩阵
%[I_rgb,rect]=imcrop(I_rgb); %裁剪图片
%rectangle('Position',rect,'LineWidth',2,'EdgeColor','r');
%imwrite(I_rgb,'截图原图1.jpg') %保存
imshow(I_rgb); %显示图像
title('原始图像');
%I_hsv=rgb2hsv(I_rgb)
%将彩色图像从RGB转化到lab彩色空间
C = makecform('srgb2lab'); %设置格式makecform创建一个颜色转换结构
I_lab = applycform(I_rgb,C);
%进行K-mean聚类将图像分割成三个区域
ab = double(I_lab(:,:,2:3)); %取出lab空间的a分量和b分量
nrows = size(ab,1); %得到ab的行的长度
ncols = size(ab,2); %得到ab的列的长度
%reshape函数重新调整矩阵的行数、列数、维数。返回一个(nrows*ncols)*2的矩阵ab
%结果ab中元素是按列从右边ab中得到的。如果右边ab中元素个数没有(nrows*ncols)*2个, 则会引发错误。
%K表示将X划分为几类,为整数
%Distance距离测度;sqEuclidean欧氏距离;cluster初始聚类阶段随机选取10%的X的子样本;Replicates聚类重复次数,为整数
ab = reshape(ab,nrows*ncols,2); %改变矩阵的列数和行数,但是数据总个数不变
nColors=3; %分割区域为3
[cluster_idx cluster_center] = kmeans(ab,nColors,'distance','sqEuclidean','Replicates',3);% matlab自身有这个算法kmeans 算法
pixel_labels = reshape(cluster_idx,nrows,ncols);%改变矩阵的列数和行数 Idx---N*1的向量,存储的是每个点的聚类标号,center---K*P的矩阵,存储的是K个聚类质心位置
figure();
imshow(pixel_labels,[]), title('聚类结果'