如何用matlab分割颜色,Matlab:基于颜色的分割
您得到不同結果的原因是您的顏色分割算法使用了
k-means clustering.我將假設您不知道這是什么,因為熟悉其工作原理的人會立即告訴您這就是您的原因每次都會得到不同的結果.事實上,每次運行此代碼后得到的不同結果都是k-means聚類的自然結果,我將解釋原因.
它的工作原理是,對于您擁有的某些數據,您希望將它們分組為k個組.您最初在數據中選擇k個隨機點,這些點將包含1,2,…,k的標簽.這就是我們所說的質心.然后,確定其余數據與這些點之間的接近程度.然后,您將這些點分組,以便無論哪個點最接近這些k點中的任何一個,您都將這些點指定為屬于該特定組(1,2,…,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調用中添加了兩個附加參數.標志開始意味著您指定了初始點,種子是k x p數組,其中k是您想要的組數.在這種情況下,這與nColors相同,即3.p是數據的維度.由于您正在轉換和重塑數據的方式,這將是2.因此,您最終指定了一個3 x 2矩陣.但是,您有一個Replicate標志.這意味著k-means算法將運行您指定的特定次數,并將輸出具有最小錯誤量的分段.因此,我們將使用此標志指定的次數重復kmeans調用次數.上面的種子結構將不再是k x p而是k x p x n,其中n是您想要運行分段的次數.現在這是一個3D矩陣,其中每個2D切片確定算法的每次運行的初始點.請記住以下內容.
您如何選擇這些積分取決于您.但是,如果你想隨機選擇這些而不是留給你,但是每次你調用這個函數都要重現相同的結果,你應該將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調用之前看到復雜語句的原因.
我將重復次數作為一個變量,這樣你就可以改變它并改變你內心的內容,它仍然有用.使用permute和reshape的復雜語句使我們可以非常輕松地創建這個3D點陣.
請記住,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:基于颜色的分割的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: matlab dmodce,吧里有没有大
- 下一篇: mysql导入数据表越来越慢,快速解决m