得到LBP特征值图

// 得到 LBP纹理特征值图
// 参数:
// src 为单通道灰度图
// dst 为目标图
// 返回值:
// 返回ture 表示运行正常
// 返回false 表示运行出错
bool GetLBPFeatureImage(IplImage *src, IplImage *dst)
{
	if (! src || ! dst) return false;

	// 获取图像信息
	const int height = src->height;
	const int width  = src->width;
	const int widthStep = src->widthStep;
	const int channels  = src->nChannels;  // 通道数
	const uchar * data  = (uchar *)src->imageData;

	if (channels != 1 || data == NULL)
	{
		return false;
	}

	// 相邻点的八个方位
	const int	direct[8][2] = { {-1, 0}, {-1, 1},
	                             {0,  1}, {1,  1},
					          	 {1,  0}, {1, -1},
	                             {0, -1}, {-1,-1} };

	// 处理中的过程图
	const int temHeight = src->height + 2;
	const int temWidth  = src->width + 2;
	const int temWidthStep = src->widthStep + 2;
	const int temChannels  = src->nChannels;  // 通道数
	int *imgTem = new int[temHeight * temWidthStep];

	// 图像大小往外扩展一个单位像素
	int row = 0, col = 0;
	imgTem[row * temWidthStep + col] = (int)data[0 * widthStep + 0];
	row = 0; col = width + 1;
	imgTem[row * temWidthStep + col] = (int)data[0 * widthStep + (width-1)];
	row = height + 1; col = 0;
	imgTem[row * temWidthStep + col] = (int)data[(height - 1) * widthStep + 0];
	row = height + 1; col = width + 1;
	imgTem[row * temWidthStep + col] = (int)data[(height - 1) * widthStep + (width-1)];

	row = 0;
	for (col = 1; col < width + 1; col ++)
	{
		imgTem[row * temWidthStep + col] = (int)data[0 * widthStep + (col - 1)];
	}
	row = height + 1;
	for (col = 1; col < width + 1; col ++)
	{
		imgTem[row * temWidthStep + col] = (int)data[(height - 1) * widthStep + (col - 1)];
	}

	col = 0;
	for (row = 1; row < height + 1; row ++)
	{
		imgTem[row * temWidthStep + col] = (int)data[(row - 1) * widthStep + 0];
	}
	col = width + 1;
	for (row = 1; row < height + 1; row ++)
	{
		imgTem[row * temWidthStep + col] = (int)data[(row - 1) * widthStep + (width - 1)];
	}

	for (row = 1; row < height + 1; row ++)
	{
		for (int col = 1; col < width + 1; col ++)
		{
			imgTem[row * temWidthStep + col] = (int)data[(row - 1) * widthStep + (col - 1)];
		}
	}

	// 求LBP 特征值
	for (row = 1; row < height + 1; row ++)
	{
		for (col = 1; col < width + 1; col ++)
		{
			int bin = 0;    // 存放一个8位二进制数
			for (int k = 0; k < 8; k ++)
			{
				int valueCenterPoint = imgTem[row * temWidthStep + col]; // 中心像素值
				int valueDirectPoint = imgTem[ (row + direct[k][0]) * temWidthStep + col + direct[k][1] ]; // 相邻点的像素值

				int b = valueCenterPoint >  valueDirectPoint ? 0 : 1;

				bin += b * (int)pow(2, k); // 获得一个8位二进制数
			}
			dst->imageData[(row - 1) * widthStep + (col - 1)] = (char)bin;
		}
	}

	return true;
}

时间: 2024-11-15 02:53:04

得到LBP特征值图的相关文章

CV:object detection(LBP)

LBP(Local Binary Pattern,局部二值模式)是一种用来描述图像局部纹理特征的算子:它具有旋转不变性和灰度不变性等显著的优点.它是首先由T. Ojala, M.Pietik?inen, 和 D. Harwood 在1994年提出,用于纹理特征提取.而且,提取的特征是图像的局部的纹理特征: 1.LBP特征的描述 原始的LBP算子定义为在3*3的窗口内,以窗口中心像素为阈值,将相邻的8个像素的灰度值与其进行比较,若周围像素值大于中心像素值,则该像素点的位置被标记为1,否则为0.这样

EasyPR源码剖析(6):车牌判断之LBP特征

一.LBP特征 LBP指局部二值模式,英文全称:Local Binary Pattern,是一种用来描述图像局部特征的算子,LBP特征具有灰度不变性和旋转不变性等显著优点. 原始的LBP算子定义在像素3*3的邻域内,以邻域中心像素为阈值,相邻的8个像素的灰度值与邻域中心的像素值进行比较,若周围像素大于中心像素值,则该像素点的位置被标记为1,否则为0.这样,3*3邻域内的8个点经过比较可产生8位二进制数,将这8位二进制数依次排列形成一个二进制数字,这个二进制数字就是中心像素的LBP值,LBP值共有

图像物体检测识别中的LBP特征

1        引言 之前讲了人脸识别中的Haar特征,本文则关注人脸检测中的LBP特征,说是对于人脸检测的,其实对于其他物体也能检测,只需修改训练数据集即可.所以本文的题目是物体检测识别,比如可以检测是否汽车是否有车牌号等. 在opencv实现的haar特征的人脸识别算法中,LBP特征也被支持. haar特征的博文链接:http://blog.csdn.net/stdcoutzyx/article/details/34842233. 2        LBP的历史 1996年,Ojala老大

LBP特征提取原理及代码实现

老规矩,先上背景,算是表示对LBP算法提出者的一种尊敬(其实,是为了装...kkk,大家都懂ha). 一.LBP背景: LBP(Local Binary Pattern,局部二值模式)是一种用来描述图像局部纹理特征的算子:它具有旋转不变性和灰度不变性等显著的优点.它是首先由T. Ojala, M.Pietikäinen, 和D. Harwood 在1994年提出,用于纹理特征提取.而且,提取的特征是图像的局部的纹理特征.至今,仍在图像识别和人脸识别部分,有很好的效果. 二.LBP特征的原理: 从

libsvm的数据格式及制作

1.libsvm数据格式 libsvm使用的训练数据和检验数据文件格式如下: [label] [index1]:[value1] [index2]:[value2] … [label] [index1]:[value1] [index2]:[value2] … label  目标值,就是说class(属于哪一类),就是你要分类的种类,通常是一些整数. index 是有顺序的索引,通常是连续的整数.就是指特征编号,必须按照升序排列 value 就是特征值,用来train的数据,通常是一堆实数组成.

利用filter实时切换big5和gb2312,以及gb2312的简繁体

IEEE Spectrum 杂志发布了一年一度的编程语言排行榜,这也是他们发布的第四届编程语言 Top 榜. 据介绍,IEEE Spectrum 的排序是来自 10 个重要线上数据源的综合,例如 Stack Overflow.Twitter.Reddit.IEEE Xplore.GitHub.CareerBuilder 等,对 48 种语言进行排行. 与其他排行榜不同的是,IEEE Spectrum 可以让读者自己选择参数组合时的权重,得到不同的排序结果.考虑到典型的 Spectrum 读者需求

俑烟汲的诿樟透磺勒秤窗mvus

IEEE Spectrum 杂志发布了一年一度的编程语言排行榜,这也是他们发布的第四届编程语言 Top 榜. 据介绍,IEEE Spectrum 的排序是来自 10 个重要线上数据源的综合,例如 Stack Overflow.Twitter.Reddit.IEEE Xplore.GitHub.CareerBuilder 等,对 48 种语言进行排行. 与其他排行榜不同的是,IEEE Spectrum 可以让读者自己选择参数组合时的权重,得到不同的排序结果.考虑到典型的 Spectrum 读者需求

Python_箱型图绘制与特征值获取

它主要用于反映原始数据分布的特征,还可以进行多组数据分布特征的比较 如何利用Python绘制箱型图 需要的import的包 1 import matplotlib.pyplot as plt 2 from matplotlib.font_manager import FontProperties 3 import numpy as np 4 import pandas as pd 该函数是绘制多箱型图,且数据长度不一致的情况,input_dict = {filename1:[a1,a2,...,

图像特征提取三大法宝:HOG特征,LBP特征,Haar特征

(一)HOG特征 1.HOG特征: 方向梯度直方图(Histogram of Oriented Gradient, HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子.它通过计算和统计图像局部区域的梯度方向直方图来构成特征.Hog特征结合 SVM分类器已经被广泛应用于图像识别中,尤其在行人检测中获得了极大的成功.需要提醒的是,HOG+SVM进行行人检测的方法是法国研究人员Dalal 在2005的CVPR上提出的,而如今虽然有很多行人检测算法不断提出,但基本都是以HOG+SVM