日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

基于聚类算法的图像分割技术

發布時間:2024/3/13 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于聚类算法的图像分割技术 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本科畢業設計,在此總結。

1. 聚類概念

如今,學術界并未對聚類作出一個具體定義。目前,認可度最高的觀點是:聚類是一種無監督的分類手段。無標簽的數據集可通過聚類分析中設定的相似性度量進行分類,形成多個類簇,滿足實驗的分析需要。因聚類本身是一種具有主觀性且能獲得良好效果的研究手段,無嚴格意義上的對錯之分,只有“類內的相似和類它的排斥”這一基本準則。1974年,Everitt對聚類作出基礎定義:基于任一相似度準則,同一類簇的樣本數據具有相似特性,不同類簇的樣本數據不相似。相似度準則由研究所需實驗效果而定。類簇指數據集中相似樣本點的匯聚。聚類要求同一類簇中的點相對密集,不同類簇間點的最小距離大于任意兩個同一類簇點的距離。

1.1 基于劃分的聚類算法

基于劃分的聚類算法基本思想是將數據集中的樣本點分成若干個子集(簇),且每個樣本點只屬于一個子集(簇),數學表達如下所示。劃分聚類需預先給定聚類的數目或聚類中心,根據相似性度量的取值結果進行劃分,使數據值靠近聚類中心。并設定聚類收斂準則,通過迭代計算更新聚類中心,對數據進一步劃分,當目標函數收斂時即達到理想的聚類效果。

1.2 基于層次的聚類算法

基于層次的聚類算法基本思想是將數據樣本進行層次分解。該算法是一種樹形結構算法,基本思想是通過計算所屬不同類簇的數據間的相似性度量,構建一個嵌套型聚類樹。按照樹形結構不同,可分為凝聚型層次聚類(Agglomerative Hierarchical Clustering)和分裂型層次聚類(Divisive Hierarchical Clustering)兩種類型。凝聚型層次聚類運算形式為自底向上,即每個數據對象都放在不同的類簇中,通過相似性度量計算逐漸融合相近的類簇,直至融合為一類或達到某個閾值而終止。與之相反,分裂型層次聚類是自頂向下,所有數據對象都置于同一類簇,每一次運算后將會把大類簇分為更小的類簇。通過不斷迭代,直至將每個數據對象置于不同類或達到某個收斂條件而終止。數學形式如下所示:

1.3 基于密度的聚類算法

基于密度的聚類算法創新性地提出了數據集是低密度區域與高密度類簇的集合這一新的認識角度?;诿芏鹊木垲愃惴ǖ闹行乃枷胧?#xff1a;若數據樣本間的密度高于某個閾值,則將繼續進行分割。即每個類簇中必須包含一定密度的數據點。

1.4基于網格的聚類算法

基于網格的聚類算法將整個數據集劃分為數目有限個獨立單元,構成可以實現聚類的網絡結構。所有的數據處理均在網絡結構上實現。該算法的優點在于運算速度快,可結合多種聚類算法形成不同的類簇結果。

2 基于K-Means算法的圖像分割實驗

K-means算法歸屬于基于劃分的聚類算法,由于具有易于實現和分割效果好等優點,故在各個領域具有廣闊的應用前景。K-means算法的基本步驟為:

(1)根據樣本特征設定K個聚類中心。
(2)計算各個聚類中心鄰域內的像素與該中心的相似性度量,將像素劃分給相似性度量取值最大所屬的簇,再計算每個簇數據的均值。
(3)將該均值作為新的聚類中心,不斷迭代計算。當優化函數滿足收斂條件(即聚類中心點不再更新),則停止計算,得到聚類結果。

該算法將誤差平方和作為判定聚類中心是否發生變化的評判準則。計算各個類簇內所含樣本點距離中心的歐式距離的平方,也即計算每個類簇的誤差。因初始設定類簇個數不同,劃分的類簇也會有差異。若在兩次初始參數設置不同的實驗中,誤差平方和越小,分割效果越好。若在同一次實驗中,前后兩次誤差平方和在一個很小的范圍內波動,則認為已收斂,結束運算。算法原理如下所示:

3. 實驗結果


將每幅樣本圖像的聚類數從2取至9,逐一比較葉片圖像的分割結果,實驗結果如圖上所示。

22/4/9 填坑了
*

4 算法實現

首先是主程序`

*`clc close all I=imread('xx.bmp'); ##輸入一個二維圖像,對格式沒有要求 I=double(I)/255; #處理為二值 L=GLCM(I); #提取圖像中的灰度紋理 subplot(2,3,1) imshow(I) title('原始圖像') for i=2:6F=imkmeans(I,i);subplot(2,3,i);imshow(F,[]);title(['聚類個數=',num2str(i)]) end

其次,著重看一下這個進行kmeans函數:

function [F,C]=imkmeans(I,C) #兩個輸入量分別是圖像矩陣和聚類個數 if nargin~=2error('IMKMEANS:InputParamterNotRight','只能有兩個輸入參數!'); end if isempty(C)K=2;C=[]; elseif isscalar(C)K=C;C=[]; elseK=size(C,1); end X=exactvecotr(I); #提取特征向量 if isempty(C)C=searchintial(X,'sample',K); #尋找初始點函數 end Cprev=rand(size(C)); while trueD=sampledist(X,C,'euclidean'); #用歐氏距離判斷樣本點是否屬于這個類簇[~,locs]=min(D,[],2);for i=1:KC(i,:)=mean(X(locs==i,:),1);endif norm(C(:)-Cprev(:))<epsbreakendCprev=C; end [m,n,~]=size(I); F=reshape(locs,[m,n]);

接著,提取特征向量:

function vec=exactvecotr(img) #輸入變量依舊是圖像矩陣 [m,n,~]=size(img); vec=zeros(m*n,3); img=rgb2lab(img); #圖像顏色模型轉換 img=double(img); for j=1:nfor i=1:mcolor=img(i,j,:);#這里聚類特征僅用了圖像的顏色wx=1;wy=1;dist=[wx*j/n,wy*i/m]; % dist=[]; #可以自己添加距離和紋理這項特征texture=[]; % GLCM(img);vec((j-1)*m+i,:,:)=[color(:)];#堆疊在這就行end end

對樣本點之間進行歐氏距離計算,提取特征:

function D=sampledist(X,C,method,varargin) [n,p]=size(X); K=size(C,1); D=zeros(n,K); switch lower(method(1))case 'e'for i=1:KD(:,i)=(X(:,1)-C(i,1)).^2;for j=2:pD(:,i)=D(:,i)+(X(:,j) - C(i,j)).^2;endendcase 'c'for i=1:KD(:,i)=abs(X(:,1) - C(i,1));for j=2:pD(:,i)=D(:,i) + abs(X(:,j) - C(i,j));endend end

然后,尋找初始點和聚類中心:(這塊原理忘得有點多,后續補)

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 function [center]=searchcenter(X,kratio) [n,~]=size(X); isleft=true(n,1); count=zeros(n,1); center=[]; kind=0; dist=0; for i=1:nfor j=i+1:ndist=dist+weightdist(X(i,:),X(j,:));end end dist=dist/((n-1)*(n-1)/2); radius1=dist*kratio(1); radius2=dist*kratio(2); while any(isleft)for i=1:ncount(i)=0;if isleft(i) for j=1:nif isleft(j)dist=weightdist(X(i,:),X(j,:));count(i)=count(i) + dist<=radius1;endendendend[~,locs]=max(count);iscenter=true;for i=1:kinddist=weightdist(X(locs,:),center(i,:));iscenter=iscenter && dist>=radius2;if ~iscenterbreak;endendif iscenterkind=kind+1;center(end+1,:)=X(locs,:);for i=1:nif isleft(i)dist=weightdist(X(i,:),X(locs,:));if dist <= radius1isleft(i)=false; endend end elseisleft(locs)=false;end end

這樣就可以進行基本的聚類了。
有問題留言就行,一起進步。

總結

以上是生活随笔為你收集整理的基于聚类算法的图像分割技术的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。