圖像處理中 結構張量(structure tensor)

結構張量(structure tensor) 主要用於區分圖像的平坦區域、邊緣區域與角點區域。blog

此處的張量就是一個關於圖像的結構矩陣,矩陣結構構成以下:class

                                                                           

Rx,Ry分別爲圖像的水平與垂直梯度,然後進行求矩陣T的行列式K與跡(trace)H。lambda

根據K與H的關係來求得區分圖像的平坦、邊緣與角點區域:方法

 

平坦區域:H=0;im

邊緣區域:H>0 && K=0;img

角點區域:H>0 && K>0;di

 

該方法實際應用實例以下:matlab

原圖:    co

                                

邊緣區域:ps

                              

邊緣區域中 行列式與跡的關係圖:

                                                   

matlab實現代碼以下:

clc;
clear; 
img=double(imread('F:\Users\Revere\Pictures\CameraRoll\imgwork\smile.png'));
[m n]=size(img);
imshow(img,[]);

[Ix Iy]=gradient(img);
Ix2=Ix.^2;
Iy2=Iy.^2;
Ixy=Ix.*Iy; 

k=1;
lambda=zeros(m*n,2);
for i=1:m    
    for j=1:n       
       st=[Ix2(i,j) Ixy(i,j);Ixy(i,j) Iy2(i,j)]; %結構張量        
       K=det(st);        
       H=trace(st); %求跡                
       %全部判斷都是近似的        
       % if H<50                        %認爲是平坦區域         
       if H>50 && abs(K)<0.01*10^(-9)  %認爲是邊緣區域      
       % if H>50 && abs(K)>0.01*10^(-9) %認爲是角點區域       
       img(i,j)=255;         
   end                 
  lambda(k,:)=[K,H];       
  k=k+1; 
   end
end 

figure;
plot(lambda(:,1),lambda(:,2),'.');
ylabel('trace');
xlabel('det');
figure;
imshow(img,[]);
相關文章
相關標籤/搜索