参考:https://blog.csdn.net/quincuntial/article/details/50541815
一、LBP特征的背景介绍
LBP指局部二值模式,英文全称:Local Binary Pattern,是一种用来描述图像局部特征的算子,LBP特征具有灰度不变性和旋转不变性等显著优点。它是由T. Ojala, M.Pietikäinen, 和 D. Harwood [1][2]在1994年提出,由于LBP特征计算简单、效果较好,因此LBP特征在计算机视觉的许多领域都得到了广泛的应用,LBP特征比较出名的应用是用在人脸识别和目标检测中,在计算机视觉开源库Opencv中有使用LBP特征进行人脸识别的接口,也有用LBP特征训练目标检测分类器的方法,Opencv实现了LBP特征的计算,但没有提供一个单独的计算LBP特征的接口。
二、原始LBP特征描述及计算方法
原始的LBP算子定义在像素3*3的邻域内,以邻域中心像素为阈值,相邻的8个像素的灰度值与邻域中心的像素值进行比较,若周围像素大于中心像素值,则该像素点的位置被标记为1,否则为0。这样,3*3邻域内的8个点经过比较可产生8位二进制数,将这8位二进制数依次排列形成一个二进制数字,这个二进制数字就是中心像素的LBP值,LBP值共有2828种可能,因此LBP值有256种。中心像素的LBP值反映了该像素周围区域的纹理信息。
备注:计算LBP特征的图像必须是灰度图,如果是彩色图,需要先转换成灰度图。
上述过程用图像表示为:
将上述过程用公式表示为:
(xc,yc)(xc,yc)为中心像素的坐标,p为邻域的第p个像素,ip为邻域像素的灰度值,ic为中心像素的灰度值,s(x)s(x)为符号函数
原始LBP特征计算代码(Opencv3.4.6下):
template <typename _tp>
void getOriginLBPFeature(cv::Mat src, cv::Mat &dst)
{
dst = cv::Mat::zeros(src.rows - 2, src.cols - 2, CV_8UC1);
for (int i = 1; i<src.rows - 1; i++)
{
for (int j = 1; j<src.cols - 1; j++)
{
_tp center = src.at<_tp>(i, j);
unsigned char lbpCode = 0;
lbpCode |= (src.at<_tp>(i - 1, j - 1) > center) << 7;
lbpCode |= (src.at<_tp>(i - 1, j) > center) << 6;
lbpCode |= (src.at<_tp>(i - 1, j + 1) > center) << 5;
lbpCode |= (src.at<_tp>(i, j + 1) > center) << 4;
lbpCode |= (src.at<_tp>(i + 1, j + 1) > center) << 3;
lbpCode |= (src.at<_tp>(i + 1, j) > center) << 2;
lbpCode |= (src.at<_tp>(i + 1, j - 1) > center) << 1;
lbpCode |= (src.at<_tp>(i, j - 1) > center) << 0;
dst.at<uchar>(i - 1, j - 1) = lbpCode;
}
}
}
int main()
{
cv::Mat src = imread("..\\..\\image\\keliamoniz1.jpg", 0);
cv::Mat dst;
getOriginLBPFeature<uchar>(src, dst);
return 0;
}