基于聚类算法的图像分割技术
本科畢業(yè)設(shè)計,在此總結(jié)。
1. 聚類概念
如今,學(xué)術(shù)界并未對聚類作出一個具體定義。目前,認可度最高的觀點是:聚類是一種無監(jiān)督的分類手段。無標(biāo)簽的數(shù)據(jù)集可通過聚類分析中設(shè)定的相似性度量進行分類,形成多個類簇,滿足實驗的分析需要。因聚類本身是一種具有主觀性且能獲得良好效果的研究手段,無嚴(yán)格意義上的對錯之分,只有“類內(nèi)的相似和類它的排斥”這一基本準(zhǔn)則。1974年,Everitt對聚類作出基礎(chǔ)定義:基于任一相似度準(zhǔn)則,同一類簇的樣本數(shù)據(jù)具有相似特性,不同類簇的樣本數(shù)據(jù)不相似。相似度準(zhǔn)則由研究所需實驗效果而定。類簇指數(shù)據(jù)集中相似樣本點的匯聚。聚類要求同一類簇中的點相對密集,不同類簇間點的最小距離大于任意兩個同一類簇點的距離。
1.1 基于劃分的聚類算法
基于劃分的聚類算法基本思想是將數(shù)據(jù)集中的樣本點分成若干個子集(簇),且每個樣本點只屬于一個子集(簇),數(shù)學(xué)表達如下所示。劃分聚類需預(yù)先給定聚類的數(shù)目或聚類中心,根據(jù)相似性度量的取值結(jié)果進行劃分,使數(shù)據(jù)值靠近聚類中心。并設(shè)定聚類收斂準(zhǔn)則,通過迭代計算更新聚類中心,對數(shù)據(jù)進一步劃分,當(dāng)目標(biāo)函數(shù)收斂時即達到理想的聚類效果。
1.2 基于層次的聚類算法
基于層次的聚類算法基本思想是將數(shù)據(jù)樣本進行層次分解。該算法是一種樹形結(jié)構(gòu)算法,基本思想是通過計算所屬不同類簇的數(shù)據(jù)間的相似性度量,構(gòu)建一個嵌套型聚類樹。按照樹形結(jié)構(gòu)不同,可分為凝聚型層次聚類(Agglomerative Hierarchical Clustering)和分裂型層次聚類(Divisive Hierarchical Clustering)兩種類型。凝聚型層次聚類運算形式為自底向上,即每個數(shù)據(jù)對象都放在不同的類簇中,通過相似性度量計算逐漸融合相近的類簇,直至融合為一類或達到某個閾值而終止。與之相反,分裂型層次聚類是自頂向下,所有數(shù)據(jù)對象都置于同一類簇,每一次運算后將會把大類簇分為更小的類簇。通過不斷迭代,直至將每個數(shù)據(jù)對象置于不同類或達到某個收斂條件而終止。數(shù)學(xué)形式如下所示:
1.3 基于密度的聚類算法
基于密度的聚類算法創(chuàng)新性地提出了數(shù)據(jù)集是低密度區(qū)域與高密度類簇的集合這一新的認識角度。基于密度的聚類算法的中心思想是:若數(shù)據(jù)樣本間的密度高于某個閾值,則將繼續(xù)進行分割。即每個類簇中必須包含一定密度的數(shù)據(jù)點。
1.4基于網(wǎng)格的聚類算法
基于網(wǎng)格的聚類算法將整個數(shù)據(jù)集劃分為數(shù)目有限個獨立單元,構(gòu)成可以實現(xiàn)聚類的網(wǎng)絡(luò)結(jié)構(gòu)。所有的數(shù)據(jù)處理均在網(wǎng)絡(luò)結(jié)構(gòu)上實現(xiàn)。該算法的優(yōu)點在于運算速度快,可結(jié)合多種聚類算法形成不同的類簇結(jié)果。
2 基于K-Means算法的圖像分割實驗
K-means算法歸屬于基于劃分的聚類算法,由于具有易于實現(xiàn)和分割效果好等優(yōu)點,故在各個領(lǐng)域具有廣闊的應(yīng)用前景。K-means算法的基本步驟為:
(1)根據(jù)樣本特征設(shè)定K個聚類中心。
(2)計算各個聚類中心鄰域內(nèi)的像素與該中心的相似性度量,將像素劃分給相似性度量取值最大所屬的簇,再計算每個簇數(shù)據(jù)的均值。
(3)將該均值作為新的聚類中心,不斷迭代計算。當(dāng)優(yōu)化函數(shù)滿足收斂條件(即聚類中心點不再更新),則停止計算,得到聚類結(jié)果。
該算法將誤差平方和作為判定聚類中心是否發(fā)生變化的評判準(zhǔn)則。計算各個類簇內(nèi)所含樣本點距離中心的歐式距離的平方,也即計算每個類簇的誤差。因初始設(shè)定類簇個數(shù)不同,劃分的類簇也會有差異。若在兩次初始參數(shù)設(shè)置不同的實驗中,誤差平方和越小,分割效果越好。若在同一次實驗中,前后兩次誤差平方和在一個很小的范圍內(nèi)波動,則認為已收斂,結(jié)束運算。算法原理如下所示:
3. 實驗結(jié)果
將每幅樣本圖像的聚類數(shù)從2取至9,逐一比較葉片圖像的分割結(jié)果,實驗結(jié)果如圖上所示。
22/4/9 填坑了
*
4 算法實現(xiàn)
首先是主程序`
*`clc close all I=imread('xx.bmp'); ##輸入一個二維圖像,對格式?jīng)]有要求 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(['聚類個數(shù)=',num2str(i)]) end其次,著重看一下這個進行kmeans函數(shù):
function [F,C]=imkmeans(I,C) #兩個輸入量分別是圖像矩陣和聚類個數(shù) if nargin~=2error('IMKMEANS:InputParamterNotRight','只能有兩個輸入?yún)?shù)!'); 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); #尋找初始點函數(shù) 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); #圖像顏色模型轉(zhuǎn)換 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然后,尋找初始點和聚類中心:(這塊原理忘得有點多,后續(xù)補)
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這樣就可以進行基本的聚類了。
有問題留言就行,一起進步。
總結(jié)
以上是生活随笔為你收集整理的基于聚类算法的图像分割技术的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 广义图标与界面中的图标
- 下一篇: c学习汇总