2017-10-05 169 views
1

我發起我的高斯爲fspecial('gaussian', 4, 1),我知道gradient()是獲得一階導數的非常方便的方法。有沒有反正我可以計算一階導數而不使用gradient()?我使用它用於創建Harris角點檢測器,如圖所示如教科書中的第一個步驟:在Matlab中不使用梯度()計算高斯(dx,dy)的一階導數

  • 計算圖像Ix和Iy的水平和垂直衍生物通過用高斯
  • 的衍生物卷積的原始圖像

回答

1

如果您有意實施哈里斯角探測器,那麼您根本不應該使用gradient。傳統上做的是你使用衍生內核,並用這個內核過濾圖像。您可以使用各種內核,但我在實踐中所看到的是使用居中差異,以使橫向內核dx[-1 0 1],縱向內核dy爲此或[-1;0;1]的轉置。因此,您使用這些內核過濾圖像以獲得響應IxIy,其中這些是圖像的水平和垂直漸變,然後對這些圖像的平方版本執行高斯平滑:Ix.^2,Iy.^2以及它們的產品Ix.*Iy 。然後形成相關矩陣,找到決定因素和軌跡並確定拐角響應。任何超過這個閾值的值都是潛在的角落。對衍生圖像執行高斯平滑,如您的問題中最初所述,用高斯導數有效地過濾原始圖像。

所以假設你的圖像存儲在im,你只需要做:

im = double(im); % Cast to double precision to ensure accuracy 
dx = [-1 0 1]; 
dy = dx.'; 
Ix = conv2(im, dx, 'same'); 
Iy = conv2(im, dy, 'same'); 

你會使用IxIy最終計算哈里斯角點響應。如果您有圖像處理工具箱,我建議您改用imfilter。它更快,它使用Intel Integrated Performance Primitives (IIPP)。如果您想了解更多關於如何正確計算的信息,請查看我之前的帖子:Trying to find/understand correct implementation of Harris Corners