0、图像梯度

梯度的方向是函数变化最快的方向, 当图像中存在边缘时,一定有较大的梯度值。相反,当图像中有比较平滑的部分时,灰度值变化较小,相应的梯度也较小。 图像处理中把梯度的模简称为梯度。 通常我们用小区域模板进行卷积来计算梯度,常用的梯度算子有Sobel算子,Robinson算子,Laplace算子等。

1、离散图像的梯度

图像是一个离散空间,无法真正的求导,只有通过多项式拟合图像中某一点的导数,然后将该点处的x,y方向的导数视为该点的梯度。
梯度计算公式:

grad(x,y) = dx*i + dy*j
dx(i,j) = I(i+1,j)  - I(i,j)  //X方向偏导,该行与上一行的差值
dy(i,j) = I(i,j+1) - I(i,j)  //Y方向偏导,该列与上一列的差值

图像的一阶导数通常会产生较粗的边缘
代码实现:

//////////////////////////////////////////////////////////////////////////
/// \brief  图像梯度求解原型
/// \remark 
/// \param[in]  src    源灰度图
/// \param[in]  width  源灰度图宽
/// \param[in]  height  源灰度图高
/// \param[in/out]  grad_x   x方向梯度
/// \param[in/out]  grad_y   y方向梯度
/// \return     void
//////////////////////////////////////////////////////////////////////////
void Calcul_Gradian(const unsigned char*  src, int width, int height, char *  grad_x, char* grad_y)
{
   int rows = 0, cols = 0;

   for (rows = 0; rows < height - 1; rows++)
   {
       int idx = rows * width;

       for (cols = 0; cols < width - 1; cols++)
       {
           grad_x[idx + cols] = src[idx + cols + width] - src[idx + cols];
           grad_y[idx + cols] = src[idx + cols + 1] - src[idx + cols];
       }
   }
}

2、输出

X方向–水平边缘明显,垂直边缘不明显(窗户那边明显看得出)
图像梯度

Y方向–垂直边缘明显,水平边缘不明显(窗户那边明显看得出)
图像梯度

3、参考

https://blog.csdn.net/image_seg/article/details/78790968
https://blog.csdn.net/xieyan0811/article/details/70882266
https://blog.csdn.net/Touch_Dream/article/details/62447801

相关文章:

  • 2021-05-11
  • 2021-05-29
  • 2021-09-05
  • 2021-12-03
  • 2021-08-22
  • 2021-12-06
  • 2021-09-11
  • 2021-06-10
猜你喜欢
  • 2022-01-11
  • 2021-08-19
相关资源
相似解决方案