梯度方向计算

时间:2010-10-23 10:56:22

标签: c++ image-processing gradient

我正在从事计算机视觉课程的任务。子任务之一是基于图像亮度的梯度方向计算。我已经制作了一个明亮的[宽度] [高度]矩阵,其中包含图像每个像素的亮度值。我有两个这样的功能:

double Image::grad_x(int x,int y){
    if(x==width-1 || x==0) return bright[x][y];
    return bright[x+1][y]-bright[x-1][y];
}
double Image::grad_y(int x,int y){
    if(y==height-1 || y==0) return bright[x][y];
    return bright[x][y+1]-bright[x][y-1];
}

编辑:边界检查已修复

我正在使用简单的导数,而不使用Sobel算子'因为简单的导数足以满足我的需要。

问题是,我正在进行这种梯度计算,我究竟要做什么与边界像素(现在函数返回像素本身的值,我不确定它是否准确)?而且,顺便说一句,是否有任何用于计算图像渐变的效用?我想确保我的节目表现良好。

4 个答案:

答案 0 :(得分:1)

你的计算是正确的。这是一个你正在使用的简单渐变方法,但是如果这对你的使用没有问题,那就没有错。

角落情况是个问题,因为您没有足够的数据来计算渐变,其方式与其他像素相同。处理它们的一种方法是简单地不计算角落情况并使用略小的图像。

如果这不是一个选项,您还可以推断丢失的数据。如果您假设渐变平滑变化,则其工作方式如下:

在x梯度计算中,您可能计算了像素1的导数A和像素2的B.如果要推算像素0的值(角落情况),可以使用值a-(ba)

一个数字例子:

  pixel1: gradient = 100
  pixel2: gradient = 80

  extrapolate using a-(b-a): 

  pixel0: gradient = 100 - (80-100)) = 120

答案 1 :(得分:1)

因此,一方面,您希望保持简单,另一方面您希望程序运行良好。咦。

我实际上在做类似的事情,但我并不关心边界。我喜欢将系数基于立方B样条曲线。如果您使用2D立方B样条曲线对离散2D信号进行卷积,您将获得非常平滑且连续两次可微分的功能。可以在任意点计算该函数的精确强度和导数。由于立方B样条不是插值器,因此与原始结果相比,结果将略微平滑。但这对许多应用来说都不是问题。事实上,在许多情况下,它往往会改善事物(在某种程度上抑制噪音)。如果您不想要这种平滑效果,可以绕过它(参见下面的参考资料)。

在一个维度中,使用立方B样条作为重建滤波器进行重建,然后再次对信号进行采样,相当于将信号与

进行卷积。
1/6 4/6 1/6

完全的衍生物是:

1/2 0 -1/2

完全二阶导数是:

1 -2 1

这些系数遵循立方B样条曲线及其导数。在2D中,您可以任意组合。一个用于x方向的滤波器和一个用于y方向的滤波器。例子:

"B-Spline reconstruction" (divisor=36)
   1  4  1
   4 16  4
   1  4  1

"B-Spline differentiator in X" (divisor=12)
   1  0 -1
   4  0 -4
   1  0 -1

"B-Spline, 2nd derivative in X, 1st derivative in Y" (divisor=2)
   1 -2  1
   0  0  0
  -1  2 -1

关于这一点的好处是,即使过滤后的结果与原始信号不完全对应,但只是略微平滑的版本,它们仍然相互一致。您可以使用描述here的简单预处理技巧来绕过平滑效果。你也可以但是根据你真正想做的事情,这种预处理可能是不合适的。

我用它来计算任意(子像素)点的二次泰勒近似,以找到像鞍点和局部极值这样的东西。

如果你关心边界,你需要以某种方式选择一个符合你需要的外推。我通常只重复最后一个像素的像素值。它适用于我的应用程序*。

答案 2 :(得分:0)

你如何处理边界完全取决于应用程序。镜像,外推,添加零,取决于您的需求。

现在你把亮度值作为边界,我不会这样做,它没有任何意义。就像你的图像在所有边框上有更多的像素并镜像,推算或归零它们的衍生计算值。

为什么不采用Sobel内核?这是快速而不是更多的编码工作?

编辑:您不检查x方向的边框。 grad_x(0,0)将导致运行时异常。

答案 3 :(得分:0)

效用

OpenCV使用您使用的卷积内核([1 0 -1])。

边框像素:

取决于申请。以下是pad your image的一些不错方法。