2017-04-17 128 views
0

我覺得從相鄰的圖像,然後我試圖使用圖形函數來繪製圖形創建圖表:如何使用鄰接矩陣

g = graph(adj); 
plot(g); 

,但我沒有得到預期的圖形。

輸入圖像

input image

這是我的代碼。我將變量adj中的鄰接矩陣存儲起來。

clc; 
clear all; 
close all; 
X=imread('one.bmp'); 
imfinfo('one.bmp') 
figure,imshow(X) 

b = imresize(X,[100,100]); 
si = size(b,1); 
sj = size(b,2); 
%figure;imshow(b); 

% Binarization 
% th = graythresh(b); 
% I = im2bw(b,th); 
%thinning 
kl=bwmorph(~b,'thin',inf); 
figure,imshow(kl) 
R(:,:)=kl(:,:); 
%grid size 
t1=25; 
D=100; 
I=1; 
U1=t1; 
J=1; 
U2=t1; 
E=1; 
t2=D/t1; 
%Z=1; 
for iir=1:t2 
    for jjr=1:t2 
B(I:U1,J:U2)=R(I:U1,J:U2); 
% vc=sum(B(I:U1,J:U2)); 
% Fd=sum(vc); 
[x,y]=find(B==1); 
CX=mean(x); 
CY=mean(y); 
CXXX(E)=CX; 
CYYY(E)=CY; 
CXX(iir,jjr)=CX; 
CYY(iir,jjr)=CY; 

T(I:U1,J:U2)=B(I:U1,J:U2); 
    J=J+t1; 
    U2=U2+t1; 
E=E+1; 
clear B x y 

    end 

I=I+t1; 
U1=U1+t1; 
J=1; 
    U2=t1; 

end 
%plot and grid 
figure,imshow(R) 
hold on 
M10 = size(R,1); 
N10 = size(R,2); 

a=t1; 
b=t1; 
for k = 1:a:M10 
    x = [1 N10]; 
    y = [k k]; 
    plot(x,y,'Color','white'); 
    set(findobj('Tag','MyGrid'),'Visible','on') 
end 
for k = 1:b:N10 
    x = [k k]; 
    y = [1 M10]; 
    plot(x,y,'Color','white'); 
    set(findobj('Tag','MyGrid'),'Visible','on') 
end 

plot(CYY,CXX,'g*') 
%line(CYY,CXX) 
%CC=bwconncomp(CXX,4) 

hold off 
%node neighbourhoood analyssis 
N1=t2; 
for I2=1:N1 
    for J2=1:N1 
     %last row 
     if(I2>=N1) 
      W1=CXX(I2,J2); 
      W2=CXX(I2-1,J2); 
      W3=CYY(I2,J2); 
      W4=CYY(I2-1,J2);  
      W6=[W1,W2]; 
      W7=[W3,W4]; 
      line(W7,W6); 
      if(J2>=N1) 
       Z=CXX(I2,J2); 
      else 
      if (CXX(I2,J2+1)>1)&& ((CYY(I2,J2+1)>1)) 
      TXX=CXX(I2,J2); 
      TYY=CXX(I2,J2+1); 
       TTX=CYY(I2,J2); 
       TTY=CYY(I2,J2+1); 

      IY=[TXX,TYY]; 
      IIY=[TTX,TTY]; 
      line(IIY,IY); 
      end 
      end 


     else 
      if(J2>=N1); 
      W1=CXX(I2,J2); 
      W2=CXX(I2+1,J2); 
      W3=CYY(I2,J2); 
      W4=CYY(I2+1,J2);  
      W6=[W1,W2]; 
      W7=[W3,W4]; 
      line(W7,W6); 
      else 
       if (CXX(I2,J2+1)>1)&& ((CYY(I2,J2+1)>1)) 
      TXX=CXX(I2,J2); 
      TYY=CXX(I2,J2+1); 
       TTX=CYY(I2,J2); 
       TTY=CYY(I2,J2+1); 

      IY=[TXX,TYY]; 
      IIY=[TTX,TTY]; 
      line(IIY,IY); 


       end 
     if (CXX(I2+1,J2)>1)&& ((CYY(I2+1,J2)>1)) 
      W1=CXX(I2,J2); 
      W2=CXX(I2+1,J2); 
      W3=CYY(I2,J2); 
      W4=CYY(I2+1,J2);  
      W6=[W1,W2]; 
      W7=[W3,W4]; 
      line(W7,W6); 
      J2=J2+1 

     end 
     end 
    end 
    end 
end 

    A=zeros(t2,t2); 
    ttt=1; 
    for rt=1:t2 
     for rt1=1:t2 
      if(CXX(rt,rt1)>1) 
       A(rt,rt1)=ttt 
      end 
      ttt=ttt+1; 
     end 
    end 



g=1; 
jk=1; 
um=t2-1; 
um1=t2; 
for iir=1:t2 
    for jjr=1:t2 
     if(A(iir,jjr)>=0) 
      BB(jk)=0; 
         DD(g)=0; 
         FF(g)=0; 
         HH(g)=0; 
     end 
     if(A(iir,jjr)>=1) 
      if(iir==um1)&&(jjr==1) 
      GG(g)=A(iir,jjr); 
      HH(g)=A(iir-1,jjr); 
      BB(jk)=A(iir,jjr+1); 
      DD(g)=0; 
      else 
       if(iir==um1)&&(jjr>1)&&(jjr<=um) 
       FF(g)=A(iir,jjr-1); 
       BB(jk)=A(iir,jjr+1); 
       HH(g)=A(iir-1,jjr); 
       else 

       if(iir==um1)&&(jjr==um1) 
        HH(g)=A(iir-1,jjr); 
        FF(g)=A(iir,jjr-1); 
        DD(g)=0; 
        BB(jk)=0; 
       else 

     if(iir==1)&&(jjr==um1) 
      FF(g)=A(iir,jjr-1); 
      DD(g)=A(iir+1,jjr); 
      BB(jk)=0; 

     else 
      if(iir>=1)&&(iir<=um)&&(jjr==um1) 
      HH(g)=A(iir-1,jjr); 
      DD(g)=A(iir+1,jjr); 
      FF(g)=A(iir,jjr-1); 
      BB(jk)=0; 
      else 
       if(iir==1)&&(jjr==1) 
       BB(jk)=A(iir,jjr+1); 
       DD(g)=A(iir+1,jjr); 
       else 
       if(iir==1)&&(jjr>=1)&&(jjr<=um) 
       FF(g)=A(iir,jjr-1);  
       DD(g)=A(iir+1,jjr); 
       BB(jk)=A(iir,jjr+1); 
       else 
       if(iir>1)&&(iir<=um)&&(jjr==1) 
       HH(g)=A(iir-1,jjr); 
       DD(g)=A(iir+1,jjr); 
       BB(jk)=A(iir,jjr+1); 
       else 
        if(iir>1)&&(iir<=um)&&(jjr>1)&&(jjr<=um) 
         BB(jk)=A(iir,jjr+1); 
        DD(g)=A(iir+1,jjr); 
        HH(g)=A(iir-1,jjr); 
        FF(g)=A(iir,jjr-1); 
        end 
       end 
       end 
       end 
      end 
     end 
       end 
      end 
      end 
     end 
    g=g+1; 
    jk=jk+1; 
    end 

end 
adj=zeros(t2*t2); 
H9=size(adj); 
Y=1; 
for ll=1:1 
     for ii=1:H9(1,1) 
      for jj=1:H9(1,1) 
       if (ii>=4) 
        if (jj==DD(1,Y)) 
        adj(ii,jj)=1; 
       end 
       if (jj==FF(1,Y)) 
        adj(ii,jj)=1; 
       end 
       if (jj==BB(1,Y)) 
        adj(ii,jj)=1; 
       end 
       if (jj==HH(1,Y)) 
        adj(ii,jj)=1; 
       end 
       else 
       if (jj==BB(1,Y)) 
        adj(ii,jj)=1; 
       end 
       if (jj==DD(1,Y)) 
        adj(ii,jj)=1; 
       end 
       if (jj==FF(1,Y)) 
        adj(ii,jj)=1; 
       end 
       if (jj==HH(1,Y)) 
        adj(ii,jj)=1; 
       end 
       end 
      end 
      Y=Y+1; 
     end 

end 

預期輸出:

 i want graph in this form

鄰接矩陣

0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 
1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 
0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 
0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 
+0

過得好鄰接矩陣?它應該代表什麼?像素鄰接?沒有足夠的條目來表示所有像素。連接的組件鄰接關係?您的輸入圖像看起來完全連接,因此條目太多。請添加更多細節。 – Cecilia

回答

0

的問題是,圖形對象不知道你想點的任何位置情節。您需要使用質心座標來確定從鄰接矩陣繪製邊緣的位置。

假設鄰接矩陣中的點的質心由CXCY給出,您需要將此信息傳遞給plot函數。

g = graph(adj); 
plot(g, 'XData', CX, 'YData', CY); 

https://www.mathworks.com/help/matlab/ref/graph.plot.html

+0

可以請給我這個程序的完整代碼 – deepak

+0

這*是完整的代碼。我唯一遺漏的是將你的鄰接矩陣賦值給變量'A'。您只需要將「CX」和「CY」變量替換爲每個圖節點對應的座標。 – beaker

+0

而且一定要對我shivu和raghu打個招呼。 :) – beaker