我正处于MATLAB编程的第一步,当我读到一篇关于图像处理的文章时,我在大多数文章中看到它已经写过应该估计第一个和/或第二个导数。
如何在梯度上测量二阶导数(Gxx,Gxy,Gyy)?
答案 0 :(得分:2)
您可以在每个维度中应用二阶导数内核,而不是应用连续的差异:
Gx = [1 -2 1]; Gy = Gx'; %' y kernel is column vector
img = double(imread('cameraman.tif'));
Dxx = conv2(img,Gx,'same');
Dyy = conv2(img,Gy,'same');
如果您使用的是非定向二阶导数,则应使用拉普拉斯算子。一个常见的内核是:
L = [0 1 0;
1 -4 1;
0 1 0;] % fspecial('laplacian',alpha=0)
D2 = conv2(img,L,'same');
与上面的评论一样,您可以使用fspecial
来获取内核上通过alpha
参数捕获对角线差异的变体。或者您可以使用del2
:
D2 = del2(img);
答案 1 :(得分:1)
从图像处理工具箱中查看imgradient。两个应用程序应该给你你想要的。
这样的事情:
im = imread('cameraman.tif');
[Gx,Gy] = imgradientxy(im);
[Gxx,Gxy] = imgradientxy(Gx);
[Gyy,Gyx] = imgradientxy(Gy);
这使用Sobel滤波器来计算导数。您也可以通过将此字符串作为字符串传递给imgradientxy来使用Prewitt,中心差异或中间差异。
希望有所帮助。
答案 2 :(得分:0)
您可以使用diff(a,2,1)
或diff(a,2,2)
分别获得维度1和2的二阶导数