我有一个RGB图像,我正试图计算它的高斯导数。图像为灰度图像,高斯窗口为5x5,st为标准差这是我使用的代码,以找到一个二维高斯导数,在Matlab中:
N=2
[X,Y]=meshgrid(-N:N,-N:N)
G=exp(-(x.^2+y.^2)/(2*st^2))/(2*pi*st)
G_x = -x.*G/(st^2);
G_x_s = G_x/sum(G_x(:));
G_y = -y.*G/(st^2);
G_y_s = G_y/sum(G_y(:));
,其中st是我使用的标准差。在使用G_x_s和G_y_s对图像进行卷积之前,我有以下问题。当我使用偶数(2,4,6,8)的标准偏差时,程序工作并给出预期的结果。但是当我使用奇数作为标准偏差(3或5)时,那么G_y_s的值变成Inf,因为sum(G_y(:))=0。我不理解这种行为,我想知道代码是否有问题,或者在上面的公式中,标准偏差只能是偶数。如有任何帮助,我将不胜感激。
谢谢。
你的程序根本不能工作。当你使用偶数时,你发现的结果只是因为一些数值错误。
你的G
将是一个与中心对称的矩阵。x
和y
都是点对称的。所以(G乘以x或y)会得到一个和为0的矩阵。除以这个和等于除以0。你观察到的其他一切都是因为一些舍入误差。在这里,我看到og G_x
的总和约为1.3e-17。
我认为你的错误是在乘法x.*G
和y.*G
。我不明白你为什么要那样做。
我假设你想做边缘检测,对吗?你可以使用fspecial
来创建几个边缘过滤器。比如拉普拉斯高斯函数。您还可以创建两个具有不同标准差的高斯滤波器,并将它们从另一个中减去以获得边缘滤波器。