基於K-means聚類算法的MATLAB圖像分割

2022-01-22 matlab愛好者


K-means算法首先從數據樣本中選取K個點作為初始聚類中心;其次計算各個樣本到聚類的距離,把樣本歸到離它最近的那個聚類中心所在的類:然後計算新形成的每個聚類的數據對象的平均值來得到新的聚類中心;最後重複以上步驟,直到相鄰兩次的聚類中心沒有任何變化,說明樣本調整結束,聚類準則函數達到最優。

在計算數據樣本之間的距離時,可以根據實際需要選擇某種距離作為樣本的相似性度量,距離越小,樣本越相似,差異越小;距離越大,樣本越不相似,差異越大。K-means算法在每次迭代中都要考察每個樣本的分類是否正確,若不正確,則需要調整。K-means聚類算法簡捷,具有很強的搜索力,適合處理數據量大的情況,在數據挖掘和圖像處理領域中得到了廣泛的應用。採用K-means進行圖像分割,將圖像的每個像素點的灰度或者RGB作為樣本(特徵向量),因此整個圖像構成了一個樣本集合(特徵向量空間),從而把圖像分割任務轉換為對數據集合的聚類任務。然後,在此特徵空間中運用K-means聚類算法進行圖像區域分割,最後抽取圖像區域的特徵。
% 1.計算樣本之間距離function D=sampledist(X,C,method)[n,p]=size(X);k=size(C,1);D=zeros(n,k);switch lower(method(1))    case 'e' %euclidean即歐氏距離        for i=1:k            D(:,i)=(X(:,1)-C(i,1)).^2;            for j=2:p                D(:,i)=D(:,i)+(X(:,j)-C(i,j)).^2;            end        end    case 'c' %cityblock即城市距離        for i=1:k            D(:,i)=abs(X(:,1)-C(i,1));            for j=2:p                D(:,i)=D(:,i)+abs(X(:,j)-C(i,j));            end        end        end

%2.提取特徵向量function vec=extractvecotr(img)[m,n,~]=size(img);vec=zeros(m*n,3);img=double(img); for j=1:n    for i=1:m        %提取顏色特徵        color=img(i,j,:);        %提取距離特徵        wx=1;wy=1;        dist=[wx*j/n,wy*i/m];        dist=[];        %提取紋理特徵        texture=[];        %組成特徵向量        vec((j-1)*m+i,:)=[color(:);dist(:);texture(:)];    endend

%3.搜索樣本空間初始聚類中心function C=searchintial(X,method,varargin)    switch lower (method(1))        case 's'            k=varargin{1};            C=X(randsample(size(X,1),k),:);        case 'u'            Xmins=min(X,[],1);            Xmaxs=max(X,[],1);            k=varargin{1};            C=unifrnd(Xmins(ones(k,1),:),Xmaxs(ones(k,1),:));    end

%4.圖像聚類分割function [F,C]=imkmeans(I,C)if isempty(C)    k=2;    C=[];elseif isscalar(C)    k=C;    C=[];else    k=size(C,1);endX=exactvecotr(I);if isempty(C)    C=searchintial(X,'sample',k);endCprev=rand(size(C));while true     D=sampledist(X,C,'euclidean');    [~,locs]=min(D,[],2);    for i=1:k        C(i,:)=mean(X(locs==i,:),1);    end    if norm(C(:)-Cprev(:))<eps        break    end    Cprev=C;end
[m,n,~]=size(I); F=reshape(locs,[m,n]);

需要調用的函數編輯好之後就可以讀取圖像進行調試和使用。

clcclose allI=imread('IMG1.jpg');I=double(I)/255;subplot(2,3,1),imshow(I),title('原始圖像') for i=2:6F=imkmeans(I,i);subplot(2,3,i);imshow(F,[]);title(['聚類個數=',num2str(i)])end

經過2-6個聚類個數分割的結果如圖所示,不同的圖像可以根據情況調整聚類個數以便於達到理想效果。

以上就是今天介紹的基於K-means聚類算法的MATLAB圖像分割,有需要的朋友們可以自己動手嘗試,歡迎大家分享到朋友圈,讓更多有需要的朋友看到!也歡迎更多MATLAB愛好者和使用者前來交流!

參考資料:

[1]陳剛、魏晗、高毫林.MATLAB在數字圖像處理中的應用

[2]楊文茵、徐麗新.MATLAB R2016a數字圖像處理算法分析與實現

圖片來源:由作者拍攝  

相關焦點

  • K-Means聚類算法詳解
    # 規範化到[0,1]空間min_max_scaler=preprocessing.MinMaxScaler()train_x=min_max_scaler.fit_transform(train_x)# kmeans算法kmeans.fit(train_x)predict_y = kmeans.predict(train_x)# 合併聚類結果
  • 深入理解K-Means聚類算法
    # 規範化到[0,1]空間min_max_scaler=preprocessing.MinMaxScaler()train_x=min_max_scaler.fit_transform(train_x)# kmeans算法kmeans.fit(train_x)predict_y = kmeans.predict(train_x)# 合併聚類結果
  • 基於圖像的目標區域分割算法研究
    K-means算法實現的是內類相似最大化,類間相似最小化,與Otsu算法正好相反,Otsu算法是使內類達到方差最小化,內類方差最大化。K-means算法同時也存在著不足,在執行此算法時,首先需要選取初始聚類中心,還需要確定聚類數目(算法中的k值)和算法需要迭代的次數。如果所選初始中心為噪聲點或離散點,則算法很容易陷入局部聚類最優值。
  • K_means聚類的matlab應用
    本文作者:南海一號在機器學習中,我們往往會遇到很大量的數據的處理,其中有一項就是聚類,即將相似的數據聚到一起,比較基礎的就是K_means聚類算法。聚類是一種無監督學習,不需要訓練樣本有對應的標籤就可以將不同的類分開。利用的就是相同類之間的相似性以及不同類之間的差異性。
  • 直播案例 | K-Means 的 Python 實現及在圖像分割和新聞聚類中的應用
    然後將 K-Means 應用於圖像分割問題。最後我們還將使用一份中文新聞數據集,用 K-Means 算法進行自動新聞主題聚類,並使用柱狀圖和詞雲圖對聚類結果進行可視化分析。下面我們使用一份隨機生成的二維數據集,使用我們上一小節實現的 k_means 完成聚類,然後使用不同顏色標註不同類的樣本以及類中心。
  • 教程 | matlab實現kmeans聚類算法
    kmeans聚類算法是一種簡單實用的聚類算法,matlab自帶函數kmeans可直接對數據進行kmeans聚類。
  • K-Means聚類講解:算法和Sklearn的實現(附代碼)
    K-Means聚類是機器學習領域中最強大的聚類算法之一。他的原因比較簡單,但得出的結果也非常準確。聚類是理解數據集的非常重要的方式,因此在本文中,我們將討論什麼是聚類,為什麼需要聚類以及什麼是k-means聚類。
  • k-means聚類算法原理總結
    目錄1. k-means聚類算法原理2. k-means聚類算法步驟3. k-means++聚類優化算法4.小批量處理的k-means聚類算法5. k值的選取6. k-means聚類算法不適用的幾個場景7. k-means與knn區別8. 小結聚類算法性能度量的文章提到若簇類相似度好簇間的相似度差,則聚類算法的性能較好。我們基於此定義k-means聚類算法的目標函數: 其中
  • K-Means聚類算法
    是一種聚類算法,與之前提到的樸素貝葉斯等算法不同,它屬於無監督學習。簡單來說,之前的算法中我們是利用特徵 x 和類別 y 來進行訓練、分類的,而無監督學習是指不需要我們提供具體的類別 y ,而讓數據自己聚在一起,形成 k 個簇,以實現分類的目的。具體方法是通過對給定的樣本進行劃分,分為 k 個簇,使得簇內的點儘量緊密的連在一起,而簇間的距離儘量大,評判的標準就是通過歐氏距離。
  • K-means 聚類算法及其代碼實現
    K-means算法是非監督學習(unsupervised learning)中最簡單也是最常用的一種聚類算法,具有的特點是:本文章介紹
  • k-means聚類算法從入門到精通
    k-means算法是非監督聚類最常用的一種方法,因其算法簡單和很好的適用於大樣本數據,廣泛應用於不同領域,本文詳細總結了k-means聚類算法原理 。目錄1. k-means聚類算法原理2. k-means聚類算法步驟3. k-means++聚類優化算法4.
  • Python機器學習之k-means聚類算法
    ,聚類算法屬於無監督學習算法的一種.引言k-均值聚類算法屬於最基礎的聚類算法,該算法是一種迭代的算法,將規模為n的數據集基於數據間的相似性以及距離簇內中心點的距離劃分成k簇.這裡的k通常是由用戶自己指定的簇的個數,也就是我們聚類的類別個數.
  • Python聚類算法——K-means軌跡聚類
    實際上NCL就可以實現聚類算法,官方提供了k-means的算法函數(kmeans_as136),這個函數筆者也用過,相比與Python的聚類可以說還是比較麻煩的。       另外我也見過大佬們用MetoInfo的軟體做軌跡和聚類研究,十分方便。
  • K-means聚類
    距離公式什麼是K-means聚類?聚類是把一組數據點分割進少數幾個集群的過程。例如,超市裡的商品被分為幾類(黃油、奶酪和牛奶被分在奶製品)。當然,這是一種定性的劃分。一個定性的劃分方法通常都是測量產品的特定特徵,比如成分裡牛奶佔的比例等,牛奶成分比例比較高的產品被分在一類。
  • 基於matlab的RBFNN的kmeans算法研究
    Finally, kmeans algorithm improved by hierarchical clustering algorithm is used to preset radial basis function neural network in matlab.
  • 詳解 kmeans 聚類算法
    也是聚類算法中最簡單的一種了,但是裡面包含的思想卻是不一般。最早我使用並實現這個算法是在學習韓爺爺那本數據挖掘的書中,那本書比較注重應用。看了Andrew Ng的這個講義後才有些明白K-means後面包含的EM思想。聚類屬於無監督學習,以往的回歸、樸素貝葉斯、SVM等都是有類別標籤y的,也就是說樣例中已經給出了樣例的分類。而聚類的樣本中卻沒有給定y,只有特徵x,比如假設宇宙中的星星可以表示成三維空間中的點集。
  • 機器學習十大經典算法之K-Means聚類算法
    聚類介紹聚類在機器學習,數據挖掘,模式識別,圖像分析以及生物信息等領域有廣泛的應用。聚類是把相似的對象通過靜態分類的方法分成不同的組別或者更多的子集(subset),這樣讓在同一個子集中的成員對象都有相似的一些屬性,常見的包括在坐標系中更加短的空間距離(一般是歐式距離)等。
  • 機器學習之SKlearn(scikit-learn)的K-means聚類算法
    sklearn有一個完整而豐富的官網,裡面講解了基於sklearn對所有算法的實現和簡單應用。Sklearn的安裝直接在cmd命令行中輸入:pip install scikit-learn注意一點是需要自己的python版本要大於3.4Sklearn常用算法模塊sklearn中常用的模塊有分類、回歸、聚類、降維、模型選擇、預處理。
  • 聚類算法之Kmeans
    聚類算法之Kmeans聚類算法其實有很多,包括層次聚類,密度聚類,譜聚類等等。但是為何這篇只提Kmeans,是因為Kmeans是算法理解簡單,而又使用最多,並且從原理上來說,其它的聚類算法只是其算法或求解思路有些差別,但是其核心思路還是一致,具體做的事也是有著同一個目標,故而這篇我們重點詳細單獨闡述Kmeans算法。對於其它聚類算法,如果必要,我們在下一篇再進行展開。
  • K-means 算法實現二維數據聚類
    聚類分析是一種無監督的觀察式學習方法,在聚類前可以不知道類別甚至不用給定類別數量。目前聚類廣泛應用於統計學、生物學、資料庫技術和市場營銷等領域。聚類算法有很多種,如K-means(K均值聚類)、K中心聚類、密度聚類、譜系聚類、最大期望聚類等。這裡我們重點介紹K-means聚類算法,該算法的基本思想是以空間中K個點為中心進行聚類,對最靠近它們的對象歸類。