結構張量(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,[]);