LBP特征(1)原始LBP特征

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zfjBIT/article/details/90637646

参考: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;
}

  

展开阅读全文

没有更多推荐了,返回首页