自己写的LBP,用来测试效果

本人最近一直在接触图像特征提取,学院有位研究计算机视觉的老师推荐了LBP算法。

但无奈LBP算法在网上的源代码似乎不多,有可能是咱自己没找着。。。

于是,自己写了一个代码,但效果不尽人意。

在此把代码贴出来,大家交流一下,看我有什么地方需要改进,也让刚接触这个算法的人,能够迅速的了解这个算法。


上次的代码错误较多,因此重贴。

#include<cv.h>
#include<highgui.h>
#include<iostream>
#include<fstream>
using namespace std;
int main()
{
	IplImage *iplImage1 = NULL;
	IplImage *iplImage2 = NULL;
	IplImage *iplImage3 = NULL;
	CvSize cvSize;
	cvSize.width = 11;//首先,我们需要将图片缩小,这里设置图片大小
	cvSize.height = 11;
	iplImage1 = cvLoadImage("test18.jpg");
	//改变图片大小
	iplImage2 = cvCreateImage(cvSize,iplImage1->depth,iplImage1->nChannels);
	cvResize(iplImage1,iplImage2);
	double sum = 0;
	double **mat = new double*[cvSize.width];
	for(int i = 0;i < cvSize.width;i++)
		mat[i] = new double[cvSize.height];
	//图片灰度化
	for(int i = 0;i < cvSize.width;i++)
	{
		for(int j = 0;j < cvSize.height;j++)
		{
			CvScalar s = cvGet2D(iplImage1, i, j);
			mat[i][j] = 0.12*s.val[0]+0.58*s.val[1]+0.3*s.val[2];
			cout<<mat[i][j]<<' ';
			sum += mat[i][j];
		}
		cout<<endl;
	}
	cout<<sum<<endl;
	double ave = sum/cvSize.width/cvSize.height;
	cout<<ave<<endl;
	int n = (cvSize.width+1)/2;
	//循环是为了生成不同半径下的不同纹理特征(原算法要求像素点在圆周上,但本人写此代码仅为测试,所以为了简便取的是正方形边上的像素点)
	for(int i = 1;i < n;i++)
	{
string str = "";
	int x = 0,y = 0;
	int mid = (2*i+1)/2;
	//生成纹理特征
for(x = 0;x < 2*i+1;x++)
		if(mat[x][y] < ave) str += "0";
		else str += "1";
	x--;
	for(y = 1;y < 2*i+1;y++)
		if(mat[x][y] < ave) str += "0";
		else str += "1";
	y--;
	for(x = 2*i-1;x >= 0;x--)
		if(mat[x][y] < ave) str += "0";
		else str += "1";
	x++;
	for(y = 2*i-1;y >= 1;y--)
		if(mat[x][y] < ave) str += "0";
		else str += "1";
    //将纹理特征的值通过旋转,转换成最小值(旋转不变性)
	int i;
	int it = str.find_last_of('1');
int length = str.length();
	str.erase(it+1,length);
	string s(length-it-1,'0');
	str = s+str;
	cout<<str<<endl;
	ofstream fout;
	fout.open("out.txt",ios::app);
	if(!fout) cout<<"error"<<endl;
	fout<<str<<endl;
	fout.close();
	}
	return 0;
}


你可能感兴趣的:(图像,特征值提取算法,LBP)