图像的梯度
图像的梯度是一种数据trick,里面包含了物体的轮廓、外形等信息,在各种算法里面非常常见。
下面是HOG特征中使用的梯度表示。
数学表示
梯度分量
梯度幅值和方向
图形表示
代码表示
opencv源码, computeGradient函数。
for( y = 0; y < gradsize.height; y++ )
{
const uchar* imgPtr = img.ptr(ymap[y]);
//In case subimage is used ptr() generates an assert for next and prev rows
//(see http://code.opencv.org/issues/4149)
const uchar* prevPtr = img.data + img.step*ymap[y-1];
const uchar* nextPtr = img.data + img.step*ymap[y+1];
float* gradPtr = grad.ptr<float>(y);
uchar* qanglePtr = qangle.ptr(y);
if( cn == 1 )
{
for( x = 0; x < width; x++ )
{
int x1 = xmap[x];
dbuf[x] = (float)(lut[imgPtr[xmap[x+1]]] - lut[imgPtr[xmap[x-1]]]);
dbuf[width + x] = (float)(lut[nextPtr[x1]] - lut[prevPtr[x1]]);
}
}
else
{
...
}
// computing angles and magnidutes
cartToPolar( Dx, Dy, Mag, Angle, false );
}
未完待续