我正在C中实现统一的LBP,但是我对这个概念感到困惑。我已经实现了LBP。假设我有一个512*512维的图像。LBP后是510*510。现在如何从这个LBP图像中获得256个像素。
for(i=1; i < image_src->width - 1; i++)
{
for(j=1; j < image_src->height - 1; j++)
{
const unsigned char center = image_get_pixel_value(image_src, i, j , 0);
unsigned char code = 0;
if(center <= image_get_pixel_value(image_src, i-1, j-1 , 0))
code += 128;
if(center <= image_get_pixel_value(image_src, i-1, j , 0))
code += 64;
if(center <= image_get_pixel_value(image_src, i-1, j+1 , 0))
code += 32;
if(center <= image_get_pixel_value(image_src, i, j+1 , 0))
code += 16;
if(center <= image_get_pixel_value(image_src, i+1, j+1 , 0))
code += 8;
if(center <= image_get_pixel_value(image_src, i+1, j , 0))
code += 4;
if(center <= image_get_pixel_value(image_src, i+1, j-1 , 0))
code += 2;
if(center <= image_get_pixel_value(image_src, i, j-1 , 0))
code += 1;
image_set_pixel_value(image_tar, i-1, j-1, 0, code);
}
}
这是查找表:
int UniformPattern59[16][16] = {
1, 2, 3, 4, 5, 0, 6, 7, 8, 0, 0, 0, 9, 0, 10, 11,
12, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 14, 0, 15, 16,
17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
18, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 20, 0, 21, 22,
23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
25, 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 27, 0, 28, 29,
30, 31, 0, 32, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 34,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36,
37, 38, 0, 39, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 41,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42,
43, 44, 0, 45, 0, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0, 47,
48, 49, 0, 50, 0, 0, 0, 51, 52, 53, 0, 54, 55, 56, 57, 58
};
最佳答案
我想你可能误解了关于LBP的概念。LBP有两种变体:基本LBP、均匀LBP和旋转不变均匀LBP。
在基本LBP中,我们比较中心像素与其相邻像素之一(插值像素以获得更精确的结果)之间的灰度值,以得到该位的二进制编码(0或1)。通常,我们将此编码方案的半径设置为1,将邻居数设置为8作为默认配置。因此,我们可以在比较所有8个邻域(8位二进制数,例如01011110或11110000)之后,得到中心像素的局部二进制模式(LBP)。在这里,如果我们将二进制数转换成十进制数,我们可以看到这种LBP的范围是从0到255我们通常将每个像素的LBP码分成256种模式中的一种,以形成直方图,用于进一步的分类或识别任务,即问题中的256个像素。
然而,均匀和旋转不变的均匀LBPs有一些不同之处。也就是说,模式的数目不是256,其中旋转不变的均匀LBP只有10种模式。旋转均匀LBP有9个旋转均匀LBP和1个旋转均匀LBP,其中9个旋转均匀LBP通常覆盖图像上90%的图案。
因此,在旋转不变的均匀LBP中,您只需要生成一个10格的直方图来进行进一步的处理,例如分类或识别。首先,将每个像素编码为旋转不变的统一LBP,它可能生成一个image.rows*image.cols矩阵。然后,将每个模式(矩阵元素)分类为10个模式中的一个,形成一个数组来表示直方图。
一些文件供您参考:
学术图书馆学学士学位,http://www.scholarpedia.org/article/Local_Binary_Patterns
由LBP作者编写的C++代码,http://www.cse.oulu.fi/CMV/Downloads/LBPSoftware
基于局部二值模式的多分辨率灰度旋转不变纹理分类,http://www.rafbis.it/biplab15/images/stories/docenti/Danielriccio/Articoliriferimento/LBP.pdf
关于c - 如何从LBP图像中获得256个bin/像素?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12071800/