CVPR讀書筆記[6]:Gabor特徵提取
朱金華 [email protected] 2014.08.16 週六
本文是Gabor特徵提取三部分之三:
[1]CVPR讀書筆記[4]:Gabor特徵提取之Gabor核
http://blog.csdn.net/njzhujinhua/article/details/38460861
[2] CVPR讀書筆記[5]:Gabor特徵提取之Gabor核的實現
http://blog.csdn.net/njzhujinhua/article/details/38610281
[3] CVPR讀書筆記[6]:Gabor特徵提取
http://blog.csdn.net/njzhujinhua/article/details/38614697
上兩節講到了Gabor濾波器核的原理及實現, 有了濾波器的kernel, 使用該濾波器也就是很簡單的事了.
對於圖像濾波,一種可以直接在空域進行原圖像與kernel進行卷積運算, 另一種是將原圖像與kernel分別進行傅里葉變換在頻域進行濾波,然後再反變換回來,即用頻域濾波代替卷積加快計算速度.
[1]空域濾波
這個直接用filter2D完成了, 首先依次用每個覈對原圖像進行濾波得到用該Gabor核採集的特徵, 並將之變爲一行.
最後將所有核採集的特徵矩陣變爲1行(對32*32的圖像,起一個核採集後是1*1024數據, 40個核採集後是40*1024,最後reshape變爲1*40960).(這個原本爲一列的,大部分理論中講的也都是按樣本特徵爲列向量來的,後來見svm中樣本爲行向量,便如此設定了. 設爲行向量也方便一個樣本的特徵的內存拷貝)
Mat FaceFeature_gabor::GetFeature(Mat &src)
{
Mat feature;
Mat feat_part[GABOR_SCALE_NUM][GABOR_ANGLE_NUM];
for (int i=0; i< GABOR_SCALE_NUM; i++)
{
for (int j=0;j<GABOR_ANGLE_NUM;j++)
{
filter2D(src, feat_part[i][j], CV_32F, m_gabor.m_gaborReKernel[i][j]);
Mat tmp;
normalize(feat_part[i][j],tmp,0,255,CV_MINMAX,CV_32FC1);
//test
//imshow("gaborface", tmp);
//waitKey();
//test end
tmp = tmp.reshape(1,1);
feature.push_back(tmp);
}
}
return feature.reshape(1,1);
}
[2]頻域濾波
通過將每個Gabor核進行傅里葉變換,得到其頻域的濾波核.一個運行的系統,Gabor核設定好後一般不變,於是其頻域的濾波核也不會變,這裏只需做一次即可.後面對每個人臉採集特徵時都是直接使用了.
在變換生成濾波核的大小時需要先將原空域核copyMakeBorder成與要處理的預設的標準人臉大小相匹配, 以便後面在頻域要進行的濾波(mulSpetrums運算).
bool FaceFeature_gabor::InitFreqKernel()
{
Mat mergecomplexkernel;
int freqksize=getOptimalDFTSize(m_faceSz.height);
for (int scaleIdx=0;scaleIdx < GABOR_SCALE_NUM; scaleIdx++)
{
for (int angleIdx = 0;angleIdx < GABOR_ANGLE_NUM; angleIdx++)
{
Mat re,im;
copyMakeBorder(m_gabor.m_gaborReKernel[scaleIdx][angleIdx], re,
0,freqksize-m_gabor.m_gaborReKernel[scaleIdx][angleIdx].rows,
0, freqksize-m_gabor.m_gaborReKernel[scaleIdx][angleIdx].cols,
BORDER_CONSTANT, Scalar::all(0));
copyMakeBorder(m_gabor.m_gaborImgKernel[scaleIdx][angleIdx], im,
0,freqksize-m_gabor.m_gaborImgKernel[scaleIdx][angleIdx].rows,
0, freqksize-m_gabor.m_gaborImgKernel[scaleIdx][angleIdx].cols,
BORDER_CONSTANT, Scalar::all(0));
Mat planes[]={re, im};
merge(planes, 2, mergecomplexkernel);
dft(mergecomplexkernel,m_gaborFreqKernel[scaleIdx][angleIdx], DFT_COMPLEX_OUTPUT);
}
}
return true;
}
對於FERET的一個原80*80像素FERET-001\01.tif的人臉處理前後如下由此頻域核即可實施對標準化後的臉進行在頻域濾波了(先dft,再mulSpectrums,代碼略)
前:100*100
得到的GaborFace如下,
其中每行表示8個方向, 每列2個一組,一共5組表示5個尺度. 每組裏面的2個上面是使用頻域濾波的結果,下面是簡單filter2D的結果