最近在处理图片分类,想用纹理特征作输入。关于这方面的整理已经有很多,不过还是系统列一下,会掌握深刻一点。
LBP(Local Binary Patterns):
基本算法就是,对于一个像素值的邻域上的值,比中心像素值小的,置0;比中心像素值大的,置1.这样再根据邻域的0、1值,生成二进制数。这样我们最后会得到一张纹理图。但往往不直接用这张图片作为训练输入,而是使用灰度直方图。统计每个灰度的值之后,用统计后的图作为输入。在实现上,还会将纹理图分成不同的grid,对每一个grid进行统计。假如x、y方向分了3、4份,则有12份grids。假如灰度值有256个,则最后统计的直方图大小为12*256(rows*cols)。
实现时往往使用圆形邻域。但圆形邻域的像素位置上可能并没有像素值,因此需要用到双线性插值计算。代码:
// 圆形邻域LBP
Mat Pre::circleNeighbor() {
Mat result;
result.create(img.rows - radius * 2, img.cols - radius * 2, img.type());
result.setTo(0);
for (int n = 0; n<neighbors; n++)
{
// sample points
float x = static_cast<float>(radius * cos(2.0*CV_PI*n / static_cast<float>(neighbors)));//这一步没有细看 找采样点坐标
float y = static_cast<float>(-radius * s