@ Леонар, спасибо за ваше воспроизведение, на самом деле причина, по которой я показываю все эти коды, заключается в том, что я не уверен в процедуре, результат следующий: все изображения разделены на 4 категории вместо 14 категорий, и есть нет логического шаблона, почему эти изображения идут в каждую группу: |

аюсь кластеризовать текстуры на основе функций, извлеченных из банка Gabor, который я создал, но результат далек от того, чего обычно ожидают, поэтому вот что я делаю >>

1-создать банк фильтров (на основе ответа МикиВот Я получаю как реальную, так и мнимую часть, чтобы потом можно было извлечь функцию 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);
         }

}

2-процессное входное изображение

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- извлечь вектор признаков из всех ответов Габора

    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- наконец, кластеризованные функции с помощью K-средних

int kt=14;
Mat labTexture;
kmeans(ftTexture,kt,labTexture,TermCriteria(CV_TERMCRIT_ITER|CV_TERMCRIT_EPS, 10000,0.0001),10,KMEANS_RANDOM_CENTERS );

в настоящее время я тестирую код наэтот набор данных Я ожидал кластеризовать набор данных в 14 класс, например, все кирпичи изображений идут в одну папку.

Ответы на вопрос(0)

Ваш ответ на вопрос