【问题标题】:How to perform 2D convolution on the gradient using matlab?如何使用matlab对梯度进行二维卷积?
【发布时间】:2021-03-12 20:23:59
【问题描述】:

我正在尝试在高斯核和梯度算子之间执行二维卷积。由于梯度由垂直分量和水平分量组成,我的问题是如何选择高斯核的大小。我试过如下,

[ux, uy]=grad(u);
G=fspecial('gaussian',[size(u,1) size(u,2)],1);
Convolution = [conv2(ux,G,'same'),conv2(uy,G,'same')];

能否请您帮我了解一下我所尝试的是否正确?

【问题讨论】:

    标签: matlab image-processing


    【解决方案1】:

    正确的方法是将图像u 与高斯核的导数进行卷积。这些导数可以数值计算(即不使用grad 函数中使用的导数的有限差分近似)。有关详细信息,请参阅this old blog post of mine。简而言之,根据OP的要求,可以计算(∇G)*f,而不是计算G*(∇f) ,这完全一样,但在离散世界中可以用更小的误差来计算。这里,*是卷积算子,∇是梯度算子,G是高斯核,f是图像。注意 ∇(G*f) 也是一样的!这是因为所有这些运营商都在通勤。

    渐变是一个包含两个分量的向量,因此您的渐变图像将包含两个分量。您可以将其编码为两个单独的图像,一个用于 x 方向的导数,一个用于 y 方向的导数。这是大多数图像处理环境中最简单的解决方案。高斯梯度可以这样计算:

    img = single(imread('cameraman.tif'));
    sigma = 1;
    cutoff = ceil(3*sigma);
    h = fspecial('gaussian',[1,2*cutoff+1],sigma);
    dh = h .* (-cutoff:cutoff) / (-sigma^2);
    dx = conv2(dh,h,img,'same');
    dy = conv2(h,dh,img,'same');
    

    如果你想以更好的方式处理渐变和类似的东西,我建议你使用DIPimage,这是我设计的一个 MATLAB 工具箱。在那里,渐变图像是单个图像,其中每个像素有两个分量(如果是 3D 图像,则三个分量)。它允许您以比其他库更简洁的方式对该渐变图像进行进一步处理。一个典型的例子是计算Harris corner detector

    img = readim('trui');
    g = gradient(img,1);
    S = gaussf(g*g',5);
    corners = det(S) - 0.04 * trace(S).^2;
    

    这段代码中的图像g是图像img的高斯梯度,即我们之前创建的dxdy图像。

    【讨论】:

    • 非常感谢您非常有帮助的回答。我看到了你建议的有用链接,我明白“计算用高斯模糊的图像的梯度与用高斯梯度对图像进行卷积是一样的”,但我需要将图像的梯度与高斯核为 conv2(g,grad u) 其中 u 是图像,ang g 是高斯核,grad u 是 u 的梯度。我可以按照您提到的程序执行此案例吗?非常感谢您的宝贵时间。
    • @eli 卷积和梯度算子通勤。也就是说,无论以何种顺序执行这两个操作,都会得到相同的结果。 conv(g,grad(u))grad(conv(g,u)) 相同,也与conv(grad(g),u) 相同。
    • 非常感谢您的宝贵时间和非常有用的回答。
    【解决方案2】:

    您可能希望通过对图像函数进行傅里叶变换来考虑在频域中执行此操作。 https://www.dspguide.com/ch24/6.htm 快很多了。

    【讨论】:

    • 是的,但我需要学习如何在不使用傅立叶变换的情况下执行此代码。我对这个问题感到困惑,因为梯度由水平和垂直分量组成,在这种情况下我不知道如何选择高斯核。
    猜你喜欢
    • 2013-10-09
    • 2011-01-27
    • 1970-01-01
    • 2015-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-21
    • 2021-09-02
    相关资源
    最近更新 更多