图像分割(image segmentation)matlab实现
利用k-means算法对cherry.jpg和dog.jpg两图RGB模式的图像按颜色进行分割,并显示分割结果。此处使用matlab自带的kmeans函数。
补充知识:RGB模式的图像读入后为m*n*3的数组,记这个数组为a,则a(:, :, 1)为颜色通道R上的取值矩阵,a(:, :, 2)为颜色通道G上的取值矩阵,a(:, :, 3)为颜色通道B上取值矩阵。图像中位于第i行第j列的像素点的颜色为a(i, j, :),它包括a(i, j, 1),a(i, j, 2),a(i, j, 3),分别是在3个颜色通道上的颜色取值,这些取值共同决定一个像素点显示为什么颜色。
完整代码如下:
分割的原图如下:
img=imread(./dog.jpg); %img=imread(./cherry.jpg); subplot(2,3,1); imshow(img); C = makecform(srgb2lab); %设置转换格式 img_lab = applycform(img, C); ab = double(img_lab(:,:,2:3)); %取出lab空间的a分量和b分量 nrows = size(ab,1); ncols = size(ab,2); ab = reshape(ab,nrows*ncols,2); nColors = 3; %分割的区域个数为3 [cluster_idx cluster_center] = kmeans(ab,nColors,distance,sqEuclidean,Replicates,3); %重复聚类3次 pixel_labels = reshape(cluster_idx,nrows,ncols); subplot(2,3,2); imshow(pixel_labels,[]), title(聚类结果); %显示分割后的各个区域 segmented_images = cell(1,3); rgb_label = repmat(pixel_labels,[1 1 3]); for k = 1:nColors color = img; color(rgb_label ~= k) = 0; segmented_images{k} = color; end subplot(2,3,3); imshow(segmented_images{1}), title(分割结果——区域1); subplot(2,3,4); imshow(segmented_images{2}), title(分割结果——区域2); subplot(2,3,5); imshow(segmented_images{3}), title(分割结果——区域3);