DBSCAN聚类分析在图像分割的应用
工具:matlab
k均值和dbscan我就不說了,網上很容易就搜到了。
我這個是基于k均值的dbscan,是當時老師給我發的一篇論文,我看了之后把東西稍微改了一下拿來用的,因為原來的那個論文的算法里面有個動態參數他沒說是怎么得到的,然后我就把它變了,直接設成常數了,因為涉及到的因變量的值是兩個方向決定的,一個設成常數,通過另一個來體現就可以了。
基本流程就是先把數據讀進去,然后改成灰度值數據,再進行聚類,完了再給他染色。
步驟1:先將原始數據進行K均值聚類處理,得到含有 個標記的矩陣;
步驟2:對第 個類求出類內最大距離和類內最小距離;
步驟3:再將最大距離減去最小距離分為 個組,構建一個統計量,每段距離下面對應這個距離包含了樣本對數(一對樣本產生一個距離);
步驟4:找出包含樣本對數最多的一組距離,取他們的距離的中值作為該類的距離參數 (比如最大距離20,最小距離5, 是5,就用20減去5得到15,再將距離15分成5段,每一段占3,第一段就是6到8,第二段9到11,第三段12到14,第四段15到17,第五段18到20。假如第四段距離包含了最多的樣本對數,就將(15+17)/2得到的值16作為該類的距離 );
步驟5:計算類中每個元素的r鄰域包含的元素個數,取最小的作為這個類的數量參數 。所有類的數量參數確定之后,選取最大的作為所有類的數量參數 ;
步驟6:現在一共有 個距離參數 和一個數量參數 。重新對數據進行DBSCAN聚類。選擇一個沒考慮過的元素,將集合 中所有與之密度相連 的元素找出,歸為一類,如果沒有,則將其標為噪聲點;
步驟7:重復步驟1直到 中所有的元素都被考慮過。
本來想做RGB數據的聚類的,三維的,灰度值數據是一維的,換成三維后需要的內存太大了!直接運行不下去出錯了,然后就放棄了,要是不想放棄就改個距離,不用歐氏距離。
結果:
足球選手圖像是我同學給我發的,哈哈。那天聊天說了一下我的進度,他就拿來讓我試試,試試就逝世。
Im_sage_nospace:(主函數?,不知道怎么叫,就是不被調用的那種)
先看一下直方圖,自己選個k在下面賦值,然后再運行。
DBSCAN_kmeans:
function IDX=DBSCAN_kmeans(GRAY,K,epsilon)[m1,m2]=size(GRAY);X=reshape(GRAY,m1*m2,1);X=double(X);b=kmeans(X,K);MinPts=zeros(K,1);for i =1:KG=X;G((b(:)~=i))=[];G=unique(G);G(G(:)==0)=[];y=zeros(numel(G),1);for q=1:numel(G)y(q)=numel(RegionQuery(G(q)));endMinPts(i)=sum(y)/numel(y); endC=0;n=size(X,1);IDX=zeros(n,1);visited=false(n,1); for i=1:nif ~visited(i)visited(X==X(i))=true;l=b(i);Neighbors=RegionQuery(X(i)); if numel(Neighbors)>=MinPts(l) B=zeros(2*n,1);B(1:numel(Neighbors),1)=Neighbors;C=C+1;ExpandCluster(i,C);end endendIDX=reshape(IDX,m1,m2);function ExpandCluster(i,C) IDX((X<=X(i)+epsilon)&(X>=X(i)-epsilon))=C; visited(X==X(i))=true;k = 1;while true k=k+1; j = B(k); if j==0break;endif ~visited(j)visited(j)=true;Neighbors2=RegionQuery(X(j)); visited(X==X(j))=true;l=b(j);if numel(Neighbors2)>=MinPts(l)IDX((X<=X(j)+2)&(X>=X(j)-2))=C;t=sum(sum(B~=0)); B(t+1:t+numel(Neighbors2),1)=Neighbors2;B1=unique(B);B1(1)=[];B=zeros(2*n,1);B(1:numel(B1),1)=B1;endend endendfunction Neighbors=RegionQuery(i)D=abs(X-i);Neighbors=find(D<=epsilon);end end下面這個是灰度變成RGB的,我是從csdn上找到一個,然后也給里面改了改,改成合適我的,就拿來用了
function R=gray2rgb(img1) % img1 - Source Image (gray image) % img2 - Selected color image for coloring the gray image. clc; warning off; imt=img1; ims=imread('C:\Users\Administrator\Desktop\圖像分割的圖\qise.png'); [sx, sy, sz]=size(imt); [tx, ty ,tz]=size(ims); if sz~=1imt=rgb2gray(imt); end if tz~=3disp ('img2 must be a color image (not indexed)'); elseimt(:,:,2)=imt(:,:,1);imt(:,:,3)=imt(:,:,1);% Converting to ycbcr color spacenspace1=rgb2ycbcr(ims);nspace2= rgb2ycbcr(imt);ms=double(nspace1(:,:,1));mt=double(nspace2(:,:,1));m1=max(max(ms));m2=min(min(ms));m3=max(max(mt));m4=min(min(mt));d1=m1-m2;d2=m3-m4; % Normalizationdx1=ms;dx2=mt;dx1=(dx1*255)/(255-d1);dx2=(dx2*255)/(255-d2);[mx,my,mz]=size(dx2); %Luminance Comparisondisp('Please wait..................');for i=1:mxfor j=1:myiy=dx2(i,j);tmp=abs(dx1-iy);ck=min(min(tmp));[r,c] = find(tmp==ck);ck=isempty(r);if (ck~=1) nimage(i,j,2)=nspace1(r(1),c(1),2);nimage(i,j,3)=nspace1(r(1),c(1),3);nimage(i,j,1)=nspace2(i,j,1); endendendrslt=ycbcr2rgb(nimage);R=uint8(rslt); end end總結
以上是生活随笔為你收集整理的DBSCAN聚类分析在图像分割的应用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用Dev C++进行Windows s
- 下一篇: vue:如何实现文字竖排