结构张量(structure tensor) 主要用于区分图像的平坦区域、边缘区域与角点区域。

此处的张量就是一个关于图像的结构矩阵,矩阵结构构成如下:

15fe1a1ee3d7da4db016deeaeb968277.png

Rx,Ry分别为图像的水平与垂直梯度,而后进行求矩阵T的行列式K与迹(trace)H。

根据K与H的关系来求得区分图像的平坦、边缘与角点区域:

平坦区域:H=0;

边缘区域:H>0 && K=0;

角点区域:H>0 && K>0;

该方法实际应用实例如下:

原图:

f201ba90be7448bc1d46c892f8165f49.png

边缘区域:

322a371252dbd5b4f51589aad473be04.png

边缘区域中 行列式与迹的关系图:

cd337438a72fe8b3f78dd50bc9c32f7a.png

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,[]);

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐