gpt4 book ai didi

matlab - Matlab:基于颜色的分割

转载 作者:太空宇宙 更新时间:2023-11-03 20:16:10 26 4
gpt4 key购买 nike

今天早些时候,我根据http://www.mathworks.com/products/demos/image/color_seg_k/ipexhistology.html和Matlab的答案编写了这个脚本:

clc;
clear;
close all;
input_im=imread('C:\Users\Udell\Desktop\T2.jpg');
sz_im=size(input_im);

cform = makecform('srgb2lab');
lab_he = applycform(input_im,cform);
ab = double(lab_he(:,:,2:3));
nrows = size(ab,1);
ncols = size(ab,2);
ab = reshape(ab,nrows*ncols,2);

nColors = 3;
% repeat the clustering 3 times to avoid local minima
[cluster_idx, cluster_center] = kmeans(ab,nColors,'distance','sqEuclidean', 'Replicates',3);

pixel_labels = reshape(cluster_idx,nrows,ncols);
%imshow(pixel_labels,[]), title('image labeled by cluster index');
segmented_images = cell(1,3);
rgb_label = repmat(pixel_labels,[1 1 3]);

for k = 1:nColors
color = input_im;
color(rgb_label ~= k) = 0;
segmented_images{k} = color;
end

for k=1:nColors
%figure
title_string=sprintf('objects in cluster %d',k);
%imshow(segmented_images{k}), title(title_string);
end


finalSegmentedImage=segmented_images{1};
%imshow(finalSegmentedImage);
close all;

Icombine = [input_im finalSegmentedImage];
imshow(Icombine);

在多次运行脚本时,我注意到,当组合图像(Icombine)的finalSegmentedImages=SegmentedImages{1}时,我得到了不同的图像。
为什么?我如何才能修复它,使结果重复(例如,分割的图像{1}图像将始终相同)?
谢谢。
图像:

最佳答案

你得到不同结果的原因是你的颜色分割算法使用k-means clustering我假设你不知道这是什么,因为熟悉它工作原理的人会马上告诉你,这就是为什么你每次都会得到不同的结果事实上,每次运行此代码后得到的不同结果是k-means集群的自然结果,我将解释原因。
它的工作原理是,对于您拥有的某些数据,您希望将它们分组为k个组最初在数据中选择k个随机点,这些点的标签来自1,2,...,k这就是我们所说的质心然后,确定其余数据与这些点之间的距离然后对这些点进行分组,以便无论哪个点最接近这些k个点中的任何一个点,都可以将这些点指定为属于该特定组(1,2,...,k)之后,对于每个组的所有点,更新质心,质心实际上被定义为每个组的代表点对于每个组,计算k个组中所有点的平均值这些将成为下一次迭代的新质心在下一次迭代中,您将确定数据中的每个点与每个质心之间的距离你不断重复这个行为,直到质心不再移动,或者它们很少移动。
这如何适用于上述代码是,你正在采取的图像,你想表示的图像只使用k种可能的颜色每一种可能的颜色都是质心找到每个像素所属的簇后,将用该像素所属簇的质心替换像素的颜色因此,对于图像中的每一个颜色像素,您需要确定该像素在k种可能的颜色中最好用哪种表示这是一个颜色分割的原因是因为你分割的图像只属于k种可能的颜色在更一般的意义上,这就是所谓的无监督分割。
现在,回到k-means如何选择初始质心是获得不同结果的原因您以默认方式调用k-means,它自动确定算法将从哪些初始点中选择因此,不能保证每次调用算法时都生成相同的初始点如果要重复相同的分段,不管调用了多少次kmeans,都需要自己指定初始点因此,您需要修改k-means调用,使其看起来像这样:

[cluster_idx, cluster_center] = kmeans(ab,nColors,'distance','sqEuclidean', ...
'Replicates', 3, 'start', seeds);

请注意,调用是相同的,但是我们向k-means调用添加了两个附加参数标志 start表示您正在指定初始点, seeds是一个 k x p数组,其中k是您想要的组数在本例中,这与 nColors相同,后者是3 p是数据的维度由于您正在转换和重塑数据的方式,这将是2因此,您最终要指定一个 3 x 2矩阵但是,这里有一个 Replicate标志这意味着k-means算法将运行您指定的特定次数,并且它将输出误差最小的分段因此,我们将按此标志指定的次数重复 kmeans调用上面的 seeds结构将不再是 k x p而是 k x p x n,其中 n是要运行分段的次数这现在是一个三维矩阵,其中每个二维切片确定算法每次运行的初始点以后记住这个。
你如何选择这些要点取决于你但是,如果您希望随机选择这些函数,而不是让它由您自己决定,而是希望每次调用此函数时都复制相同的结果,那么您应该将 random seed generator设置为一个已知的数字,如 123这样,当您生成随机点时,它将始终生成相同的点序列,因此是可复制的因此,在调用 kmeans之前,我会将其添加到您的代码中。
rng(123); %// Set seed for reproducibility
numReplicates = 3;
ind = randperm(size(ab,1), numReplicates*nColors); %// Randomly choose nColors colours from data
%// We are also repeating the experiment numReplicates times

%// Make a 3D matrix where each slice denotes the initial centres for each iteration
seeds = permute(reshape(ab(ind,:).', [2 nColors numReplicates]), [2 1 3]);

%// Now call kmeans
[cluster_idx, cluster_center] = kmeans(ab,nColors,'distance','sqEuclidean', ...
'Replicates', numReplicates, 'start', seeds);

请记住,您指定了 Replicates标志,我们希望将此算法重复一定次数这是 3因此,我们需要为算法的每次运行指定初始点因为我们将有3个点簇,并且我们将运行此算法3次,我们总共需要9个初始点(或 nColors * numReplicates)每个初始点集都必须是3D数组中的一个片段,这就是为什么在调用 kmeans之前会看到这个复杂的语句。
我把复制的次数作为一个变量,这样你就可以随心所欲地改变它,它仍然可以工作使用 permutereshape的复杂语句可以非常容易地创建点的三维矩阵。
请记住,到目前为止,对MATLAB中 randperm的调用仅接受第二个参数如果上面对 randperm的调用不起作用,请执行以下操作:
rng(123); %// Set seed for reproducibility
numReplicates = 3;
ind = randperm(size(ab,1)); %// Randomly choose nColors colours from data
ind = ind(1:numReplicates*nColors); %// We are also repeating the experiment numReplicates times

%// Make a 3D matrix where each slice denotes the initial centres for each iteration
seeds = permute(reshape(ab(ind,:).', [2 nColors numReplicates]), [2 1 3]);

%// Now call kmeans
[cluster_idx, cluster_center] = kmeans(ab,nColors,'distance','sqEuclidean', ...
'Replicates', numReplicates, 'start', seeds);

现在使用上面的代码,您应该能够每次生成相同的颜色分割结果。
祝你好运!

关于matlab - Matlab:基于颜色的分割,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25691735/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com