码迷,mamicode.com
首页 > 其他好文 > 详细

得到LBP特征值图

时间:2014-12-20 22:10:25      阅读:377      评论:0      收藏:0      [点我收藏+]

标签:图像处理   algorithm   opencv   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;
}

得到LBP特征值图

标签:图像处理   algorithm   opencv   lbp   

原文地址:http://blog.csdn.net/u011504498/article/details/42047403

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!