梯度方向计算

Ant*_*ton 5 c++ gradient image-processing

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

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];
}
Run Code Online (Sandbox Code Playgroud)

编辑:边界检查已修复

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

问题是,我是否正确地进行了这个梯度计算,我到底与边界像素有什么关系(现在函数返回像素本身的值,我不确定它是否准确)?而且,顺便说一下,是否有任何用于计算图像梯度的实用程序?我想确保我的程序运行良好。

Nil*_*nck 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
Run Code Online (Sandbox Code Playgroud)