Textura de cluster baseada em recursos extraídos do Gabor
Estou tentando agrupar texturas com base nos recursos extraídos do banco Gabor que criei, mas o resultado está longe do que normalmente é esperado, então aqui está o que estou fazendo >>
1-gere um banco de filtros (com base na resposta do Mikiaqui Estou recebendo tanto a parte real quanto a imaginária para poder extrair mais tarde o recurso Magnitude)
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++) // cols = theta rows = lambda
for (int j = 1; j <= bankCols; j++ )
{
int ks=(kernel_size-1)/2;
Size KernalSize(ks,ks);
double Sigma = pos_sigma;
double Lambda = 0.5+(i*lambadaStep);
double Theta = (j*thetaStep)*CV_PI/180;
double psi = pos_psi;//*CV_PI/180
double Gamma = 0;
vector<Mat> realImag;
realImag.push_back(getGaborKernel(KernalSize,Sigma,Theta,Lambda,Gamma,psi,CV_32F));//real
realImag.push_back(getGaborKernelImag(KernalSize,Sigma,Theta,Lambda,Gamma,psi,CV_32F));//imag
Kernels.push_back(realImag);
}
}
Imagem de entrada de 2 processos
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- extrair o vetor de recurso de todas as respostas do Gabor
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- finalmente, os recursos extraídos do cluster com 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 );
Atualmente, estou testando o código emeste conjunto de dados Eu esperava agrupar dados definidos para 14 classes, por exemplo, todas as imagens de tijolos vão para uma pasta.