I am trying to group textures based on functions extracted from the Gabor bank that I created, but the result is far from what is usually expected, so here is what I do →
1-generate a filter bank (according to Miki's answer here . I get both real and imaginary parts, so that later I can extract the Magnitude function)
void Gabor::generateFilterbank(int bankRows,int bankCols) { bankCol=bankCols; bankRow=bankRows; setBankSize(); int thetaStep=pos_th_max/bankCols; int lambadaStep=(pos_lm_max/bankRows) /10; for (int i=1;i<=bankRows;i++ )
2-technology input image
void Gabor::process(Mat img) { img.convertTo(img, CV_32F, 1.0/255, 0); for (int i=0;(unsigned)i<Kernels.size();i++) { vector<Mat > responseIR; for (int j=0;(unsigned)j<Kernels[i].size();j++) { Mat IR ; filter2D(img, IR , CV_32F,Kernels[i][j]); responseIR.push_back(IR ); IR.release(); } responses.push_back(responseIR); } }
3 - extract function vector from all Gabor answers
vector<float> Gabor::getGaborFetures(ofstream &out,float name) { vector<float>fetures; Mat magnituder (responses.size(),responses[0][0].rows*responses[0][0].cols,CV_32FC1, Scalar(0.0)); fetures.push_back(name); if (responses.size()>0) { for (int i=0;(unsigned)i<responses.size();i+=2) { vector<float> mag,rel,imag; mat2Vector(responses[i][0],rel); mat2Vector( responses[i][1],imag); cv::magnitude(rel,imag, mag); for (int j=0;j<mag.size();j++) { magnituder.at<float>(i,j) =mag[j]; } } PCA pca( magnituder,Mat(),CV_PCA_DATA_AS_ROW,10); Mat result(pca.project( magnituder)); magnituder.release(); for (int i=0;i<result.rows;i++) { for(int j=0;j<result.cols;j++) { fetures.push_back(result.at<float>(i,j)); } } result.release(); for (int i=0;(unsigned)i<fetures.size();i++) out <<fetures[i]<<","; out<<endl; return fetures; } else { cerr<<"You have to process your image first!"<<endl; return fetures; } }
4- finally retrieved objects using K-means
int kt=14; Mat labTexture; kmeans(ftTexture,kt,labTexture,TermCriteria(CV_TERMCRIT_ITER|CV_TERMCRIT_EPS, 10000,0.0001),10,KMEANS_RANDOM_CENTERS );
I am currently testing the code for this dataset. I expected the cluster data to be installed in 14 classes, for example, all the brick images go to the same folder.