高次局所自己相関特徴 HLAC

はじめに

f(\b{a_1,a_2,...,a_N})=\int_Pf(\b{r})f(\b{r+a_1})...f(\b{r+a_N})d\b{r}
通称:HLAC特徴
性質:位置不変性,加法性などなど

HLAC特徴とは

HLAC特徴は位置不変性,加法性などの性質があります.
HLAC特徴は画像全体に対する積分によって計算されるので,
対象物の切り出しというものが必要なります.

一般的に

実際にHLAC特徴は一般的に2次までしか使わないです.

しかし,それでは25次元しか抽出できないので,
マスクパターンのステップ幅を1,2,3,4や1,2,4,8などとして,
75次元や100次元程度を抽出するようにします.
このステップ幅は経験則w

サンプルコード

ステップ幅は1で固定.
デバッグをちゃんとしていないので使う際は自己責任で.

void HLACExtractClass::featureExtract(IplImage* input_image, CvMat* feature_mat) const
{
	
	int h = input_image->height - 1;
	int w = input_image->width - 1;
	int wideStep = input_image->widthStep;

	int feature_num = feature_mat->rows;

	for(int i = 0; i < feature_num; i++)
		cvmSet(feature_mat, i, 0, 0.0);

	double arrayHLAC[25];
	for(int i = 0; i < 25; ++i)
		arrayHLAC[i] = 0.0;

	// 特徴抽出
	for(int iy = 1; iy < h; iy++){
		for(int ix = 1; ix < w; ix++){
			uchar p5 = (uchar)input_image->imageData[wideStep*iy + ix];
			if(p5 != 0)
			{
				arrayHLAC[0]++;
				uchar p1 = (uchar)input_image->imageData[wideStep*(iy-1) + (ix-1)];
				uchar p2 = (uchar)input_image->imageData[wideStep*(iy-1) + ix    ];
				uchar p3 = (uchar)input_image->imageData[wideStep*(iy-1) + (ix+1)];
				uchar p4 = (uchar)input_image->imageData[wideStep*iy     + (ix-1)];

				uchar p6 = (uchar)input_image->imageData[wideStep*iy	 + (ix+1)];
				uchar p7 = (uchar)input_image->imageData[wideStep*(iy+1) + (ix+1)];
				uchar p8 = (uchar)input_image->imageData[wideStep*(iy+1) + ix    ];
				uchar p9 = (uchar)input_image->imageData[wideStep*(iy+1) + (ix+1)];


				if(p1 != 0){	arrayHLAC[1]++;
					if(p8 != 0)	arrayHLAC[13]++;
					if(p3 != 0)	arrayHLAC[21]++;
					if(p7 != 0)	arrayHLAC[22]++;
				}
				if(p2 != 0){	arrayHLAC[2]++;
					if(p8 != 0)	arrayHLAC[7]++;
					if(p7 != 0)	arrayHLAC[11]++;
					if(p9 != 0)	arrayHLAC[12]++;
					if(p6 != 0)	arrayHLAC[17]++;
				}
				if(p3 != 0){	arrayHLAC[3]++;
					if(p7 != 0)	arrayHLAC[6]++;
					if(p4 != 0) arrayHLAC[9]++;
					if(p8 != 0) arrayHLAC[14]++;
				}
				if(p4 != 0){	arrayHLAC[4]++;
					if(p6 != 0)	arrayHLAC[5]++;
					if(p9 != 0)	arrayHLAC[10]++;
					if(p2 != 0)	arrayHLAC[18]++;
					if(p8 != 0)	arrayHLAC[19]++;
				}
				if(p6 != 0){
					if(p7 != 0)	arrayHLAC[15]++;
					if(p1 != 0)	arrayHLAC[16]++;
					if(p8 != 0)	arrayHLAC[20]++;
				}
				if(p9 != 0){
					if(p1 != 0)	arrayHLAC[8]++;
					if(p7 != 0)	arrayHLAC[23]++;
					if(p3 != 0)	arrayHLAC[24]++;
				}
			}
		}
	}
	
	for(int i = 0; i < feature_num && i < 25; ++i)
		cvmSet(feature_mat, i, 0, arrayHLAC[i]);
	return;

}

参考文献

http://www.neurosci.aist.go.jp/~kurita/lecture/statimage/statimage.html
豊田崇弘,長谷川修 ,”高次局所自己相関特徴の拡張”,画像電子学会誌, 2005
栗田 多喜夫,大津 展之,佐藤 辰雄,高次局所自己相関特徴を用いた顔画像の識別,情報処理学会 Vol.第45回平成4年後期, No.2(19920928) pp. 247-248