根據結構張量能區分影象的平坦區域、邊緣區域與角點區域。
此演算法也算是電腦科學最重要的32個演算法之一了。鏈結的文章中此演算法名稱為strukturtensor演算法,不過我搜尋了一下,strukturtensor這個單詞好像是德語,翻譯過來就是structure tensor結構張量了。
此處所說的張量不是相對論或黎曼幾何裡的張量,黎曼幾何的張量好多**都叫張量場了。也不是數學界還沒研究明白的對矩陣進行擴充套件的高階張量,主要是張量分解。這裡的結構張量就是乙個矩陣,乙個對影象畫素進行組織的資料結構而已。
畫素組織而成的矩陣如下:
這個公式太常見了,在harris角點檢測中就用到了。其中ix,iy就是原對原影象在x和y方向求得的偏導。
然後求矩陣e的行列式k和跡h。然後根據k和h的關係就能區分影象的區域模式了。
模式分以下三類:
平坦區域:h=0;
邊緣區域:h>0 && k=0;
角點區域:h>0 && k>0;
harris角點檢測就用到了第三類判斷。
當然,在實際應用的時候h和k的值肯定都不會是理想,所以我用的都是近似判斷。
處理結果如下:
原圖:平坦區域:
邊緣區域:
角點區域(好像也不全形點,求角點還是harris好了):
結構張量行列式與跡的關係:
其中紅框為平坦區域,黃框為邊緣區域,鋁框為角點區域。
matlab**如下:
: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
;
endlambda(k,:)=[k h];
k=k+1
;
endend
figure;
plot(lambda(:,
1),lambda(:,2),'.'
);ylabel(
'trace
');xlabel('
det'
);figure;
imshow(img,)
pytorch 張量 張量的生成
張量的生成 import torch import numpy as np 使用tensor.tensor 函式構造張量 a torch.tensor 1.0,1.0 2.2 print a 獲取張量的維度 print 張量的維度 a.shape 獲取張量的形狀大小 print 張量的大小 a.si...
pytorch 張量 張量的資料型別
張量定義 import torch torch.tensor 1.2 3.4 dtype 獲取張量的資料型別,其中torch.tensor 函式生成乙個張量 torch.float32 torch.set default tensor type torch.doubletensor 設定張量的預設資...
tensorflow 中檢視張量值和張量大小
通過with tf.session assess print sess.run y 即可列印出變數的值。下面給出例子importnumpyasnp importtensorflowastf x tf.constant 1,2,3,4,5,6 y tf.reshape x,2,3 withtf.ses...