我發起我的高斯爲fspecial('gaussian', 4, 1)
,我知道gradient()
是獲得一階導數的非常方便的方法。有沒有反正我可以計算一階導數而不使用gradient()
?我使用它用於創建Harris角點檢測器,如圖所示如教科書中的第一個步驟:在Matlab中不使用梯度()計算高斯(dx,dy)的一階導數
- 計算圖像Ix和Iy的水平和垂直衍生物通過用高斯 的衍生物卷積的原始圖像
我發起我的高斯爲fspecial('gaussian', 4, 1)
,我知道gradient()
是獲得一階導數的非常方便的方法。有沒有反正我可以計算一階導數而不使用gradient()
?我使用它用於創建Harris角點檢測器,如圖所示如教科書中的第一個步驟:在Matlab中不使用梯度()計算高斯(dx,dy)的一階導數
如果您有意實施哈里斯角探測器,那麼您根本不應該使用gradient
。傳統上做的是你使用衍生內核,並用這個內核過濾圖像。您可以使用各種內核,但我在實踐中所看到的是使用居中差異,以使橫向內核dx
爲[-1 0 1]
,縱向內核dy
爲此或[-1;0;1]
的轉置。因此,您使用這些內核過濾圖像以獲得響應Ix
和Iy
,其中這些是圖像的水平和垂直漸變,然後對這些圖像的平方版本執行高斯平滑: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');
你會使用Ix
和Iy
最終計算哈里斯角點響應。如果您有圖像處理工具箱,我建議您改用imfilter
。它更快,它使用Intel Integrated Performance Primitives (IIPP)。如果您想了解更多關於如何正確計算的信息,請查看我之前的帖子:Trying to find/understand correct implementation of Harris Corners