matlab - 在 MATLAB 中使用 imgradient 时如何解释梯度的方向?

标签 matlab image-processing gradient

我正在寻找图像的渐变。现在我只是使用 5 x 5 图像。我更感兴趣的是找到梯度的方向,但我没有在纸上手动得到结果,因为我使用 MATLAB 函数 imgradient 得到它们.请参阅以下图像以了解有关输入图像和此处用于查找图像梯度的 Sobel 过滤器的更多信息。此处使用的 3 x 3 sobel 运算符之一是我使用该函数获得的运算符

f1 = fspecial('sobel');

另一个是通过转置 f1 获得的.

请注意,我试图在这里找到一个被红色四舍五入的像素的方向。在前两种情况下,我的结果与我使用 imgradient 获得的结果相匹配函数,但在第三种情况下 imgradient给出 -135 度,而我得到的是 -45。请帮我找出错误。

Case one and case two

Case three (Mismatch in results)

还请解释如何解释以下梯度方向,如下图所示。

enter image description here

最佳答案

您的计算是正确的,但强烈建议您 不要使用 atan(y/x)定义,因为这个计算不知道梯度的角度所在的象限。做 atan(y/x)如果不正确,您的组件会错误地报告角度为 -45 度。您应该使用 atan2反而。

现在是 imgradient 的内部结构很直接。我想指出的是 imgradient 报告的角度假设 y坐标自下而上递增。另外,imgradient应该报告指向最大变化率的方向角。在图像的情况下,这指向我们从暗像素进展到亮像素的方向。

首先调用 imgradientxy被叫到 fspecial('sobel')如果您提供 sobel标志到 imgradient .其实这部分imgradientxy重要的是要记住(从第 75 行开始:MATLAB R2015a):

case 'sobel'
    h = -fspecial('sobel'); %// Align mask correctly along the x- and y- axes
    Gx = imfilter(I,h','replicate'); %'
    if nargout > 1
        Gy = imfilter(I,h,'replicate');
    end

请注意 fspecial 的输出执行以及在该行提供的注释。这是为了确保检测水平边缘的掩码(即 Gy )是 y 向下 (因为它在计算机图形学中是众所周知的)。具体来说,图像的原点在左上角而不是左下角。

这是如何在 y 中布置坐标系的图示。 -下:



来源:Wikipedia - Rotation Matrix

因此,当找到方向时,有一个额外的要求来确保梯度方向的角度是相对于 的。 y-up 坐标系,这是我们习惯的。因此,当您找到渐变的方向角度时,您需要否定 y在计算角度之前进行坐标,以便角度相对于标准约定。

追求您所寻求的梯度定义是y 的常规系统。坐标自下而上递增。否定是必需的,事实上,如果您检查 imgradient 的源代码,这正是在代码的第 127 行(版本 R2015a)所做的:
Gdir = atan2(-Gy,Gx)*180/pi; %// Radians to degrees

您可能会问自己为什么需要否定掩码并再次否定 y坐标后找到方向。原因是因为需要修改的掩码来正确捕获梯度的大小,所以我们对掩码取反一次并找到梯度大小,然后我们取反 y坐标,以便我们可以找到相对于常规坐标系的角度。

在您的情况下,鉴于 Gx = 765Gy = -765 , 将这些量代入上述等式产生:
>> Gy = 765;
>> Gx = -765;
>> Gdir = atan2(-Gy,Gx)*180/pi

Gdir =

  -135

这是有道理的,因为梯度方向对应于变化率最大的方向。 -135 度意味着我们指向西南,这在我们从暗像素进展到亮像素时确实有意义。

现在,如果您查阅第三个示例图像,imgradient 报告的角度确实是正确的。只需画一条从暗区到亮区的线,看看它与 x 成什么样的角度。轴与向右增加的列对齐。 +90 度的第一个角度是有意义的,因为我们从底部到顶部移动以跟随黑暗区域和光线。这与图像反转的情况类似。第三种情况是我们之前看到的,第四种情况只是将第三种情况旋转了 180 度,因此自然地,从暗到亮的方向角现在是 +45 度,而不是之前的 -135 度。

关于matlab - 在 MATLAB 中使用 imgradient 时如何解释梯度的方向?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35238047/

相关文章:

python - 向图像添加 RMS 噪声

python - 如何在赋值期间以向量化方式移动输出变量(在 numpy 中)的索引

android - LinearGradient中心动画

matlab - 使用比 Matlab 脚本更多的内存部署的 Matlab 应用程序

c++ - MEX 中 Matlab 和 C++ 之间的内存共享

Matlab信号实现

python - 使用 Levenberg-Marquardt 的非线性最小二乘 : Reproducing Matlabs lsqnonlin with Scipy. optimize.least_squares

ios - 合并两个图像 ios Swift

android - 形状背景渐变中的淡入淡出动画

r - 基于 data.table R 中的列的条件滚动差异或梯度