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 + 1] - src[idx + cols];
grad_y[idx + cols] = src[idx + cols + width] - src[idx + cols];
}
}
}
2、输出
Y方向–水平边缘明显,垂直边缘不明显(窗户那边明显看得出)
X方向–垂直边缘明显,水平边缘不明显(窗户那边明显看得出)
3、参考
https://blog.youkuaiyun.com/image_seg/article/details/78790968
https://blog.youkuaiyun.com/xieyan0811/article/details/70882266
https://blog.youkuaiyun.com/Touch_Dream/article/details/62447801