如何用matlab分割颜色,Matlab:基于颜色的分割
您得到不同結(jié)果的原因是您的顏色分割算法使用了
k-means clustering.我將假設(shè)您不知道這是什么,因?yàn)槭煜て涔ぷ髟淼娜藭?huì)立即告訴您這就是您的原因每次都會(huì)得到不同的結(jié)果.事實(shí)上,每次運(yùn)行此代碼后得到的不同結(jié)果都是k-means聚類的自然結(jié)果,我將解釋原因.
它的工作原理是,對(duì)于您擁有的某些數(shù)據(jù),您希望將它們分組為k個(gè)組.您最初在數(shù)據(jù)中選擇k個(gè)隨機(jī)點(diǎn),這些點(diǎn)將包含1,2,…,k的標(biāo)簽.這就是我們所說的質(zhì)心.然后,確定其余數(shù)據(jù)與這些點(diǎn)之間的接近程度.然后,您將這些點(diǎn)分組,以便無論哪個(gè)點(diǎn)最接近這些k點(diǎn)中的任何一個(gè),您都將這些點(diǎn)指定為屬于該特定組(1,2,…,k).之后,對(duì)于每個(gè)組的所有點(diǎn),您更新質(zhì)心,其實(shí)際上被定義為每個(gè)組的代表點(diǎn).對(duì)于每個(gè)組,您計(jì)算每個(gè)k組中所有點(diǎn)的平均值.這些成為下一次迭代的新質(zhì)心.在下一次迭代中,您可以確定數(shù)據(jù)中每個(gè)點(diǎn)與每個(gè)質(zhì)心的接近程度.你繼續(xù)迭代并重復(fù)這種行為,直到質(zhì)心不再移動(dòng),或者它們移動(dòng)很少.
這適用于上面的代碼是您正在拍攝圖像,并且您想要僅使用k種可能的顏色來表示圖像.因此,這些可能的顏色中的每一種都是質(zhì)心.一旦找到每個(gè)像素所屬的簇,就可以將像素的顏色替換為像素所屬的簇的質(zhì)心.因此,對(duì)于圖像中的每個(gè)顏色像素,您需要確定該像素最好用哪種顏色表示.這是一種顏色分割的原因是因?yàn)槟鷮D像分割為僅屬于k種可能的顏色.在更一般的意義上,這就是所謂的無監(jiān)督分割.
現(xiàn)在,回到k-means.如何選擇初始質(zhì)心是您獲得不同結(jié)果的原因.您以默認(rèn)方式調(diào)用k-means,它自動(dòng)確定算法將從中選擇哪些初始點(diǎn).因此,每次調(diào)用算法時(shí)都不能保證生成相同的初始點(diǎn).如果您想重復(fù)相同的分段,無論您多少次調(diào)用kmeans,您都需要自己指定初始點(diǎn).因此,您需要修改k-means調(diào)用,使其看起來像這樣:
[cluster_idx, cluster_center] = kmeans(ab,nColors,'distance','sqEuclidean', ...
'Replicates', 3, 'start', seeds);
請(qǐng)注意,該調(diào)用是相同的,但我們?cè)趉-means調(diào)用中添加了兩個(gè)附加參數(shù).標(biāo)志開始意味著您指定了初始點(diǎn),種子是k x p數(shù)組,其中k是您想要的組數(shù).在這種情況下,這與nColors相同,即3.p是數(shù)據(jù)的維度.由于您正在轉(zhuǎn)換和重塑數(shù)據(jù)的方式,這將是2.因此,您最終指定了一個(gè)3 x 2矩陣.但是,您有一個(gè)Replicate標(biāo)志.這意味著k-means算法將運(yùn)行您指定的特定次數(shù),并將輸出具有最小錯(cuò)誤量的分段.因此,我們將使用此標(biāo)志指定的次數(shù)重復(fù)kmeans調(diào)用次數(shù).上面的種子結(jié)構(gòu)將不再是k x p而是k x p x n,其中n是您想要運(yùn)行分段的次數(shù).現(xiàn)在這是一個(gè)3D矩陣,其中每個(gè)2D切片確定算法的每次運(yùn)行的初始點(diǎn).請(qǐng)記住以下內(nèi)容.
您如何選擇這些積分取決于您.但是,如果你想隨機(jī)選擇這些而不是留給你,但是每次你調(diào)用這個(gè)函數(shù)都要重現(xiàn)相同的結(jié)果,你應(yīng)該將random seed generator設(shè)置為一個(gè)已知的數(shù)字,比如123.這樣,當(dāng)你生成隨機(jī)點(diǎn),它將始終生成相同的點(diǎn)序列,因此是可重現(xiàn)的.因此,我會(huì)在調(diào)用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);
請(qǐng)記住,您指定了Replicates標(biāo)志,我們希望重復(fù)此算法一定次數(shù).這是3.因此,我們需要做的是為算法的每次運(yùn)行指定初始點(diǎn).因?yàn)槲覀儗⒂?個(gè)點(diǎn)集群,并且我們將運(yùn)行該算法3次,所以我們總共需要9個(gè)初始點(diǎn)(或nColors * numReplicates).每組初始點(diǎn)必須是3D數(shù)組中的切片,這就是您在kmeans調(diào)用之前看到復(fù)雜語句的原因.
我將重復(fù)次數(shù)作為一個(gè)變量,這樣你就可以改變它并改變你內(nèi)心的內(nèi)容,它仍然有用.使用permute和reshape的復(fù)雜語句使我們可以非常輕松地創(chuàng)建這個(gè)3D點(diǎn)陣.
請(qǐng)記住,MATLAB中對(duì)randperm的調(diào)用僅接受了最近的第二個(gè)參數(shù).如果上面對(duì)randperm的調(diào)用不起作用,請(qǐng)改為:
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);
現(xiàn)在使用上面的代碼,您應(yīng)該能夠每次都生成相同的顏色分割結(jié)果.
祝你好運(yùn)!
總結(jié)
以上是生活随笔為你收集整理的如何用matlab分割颜色,Matlab:基于颜色的分割的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: matlab dmodce,吧里有没有大
- 下一篇: matlab能输入铁心参数,基于MATL