Textura de clúster basada en características extraídas de Gabor

Estoy tratando de agrupar texturas basadas en las características extraídas del banco Gabor que he creado, pero el resultado está lejos de lo que normalmente se espera, así que aquí está lo que estoy haciendo >>

1-generar un banco de filtros (basado en la respuesta de Mikiaquí Estoy obteniendo partes reales e imaginarias para poder extraer más tarde la función Magnitud)

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);
         }

}

Imagen de entrada de 2 procesos

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- extrae el vector de características de todas las respuestas de 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 agrupa las características extraídas con 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 );

Actualmente, estoy probando el código eneste conjunto de datos Esperaba agrupar el conjunto de datos en 14 clases, por ejemplo, todas las imágenes de ladrillos van a una carpeta.

Respuestas a la pregunta(0)

Su respuesta a la pregunta