user1435395
user1435395

Reputation: 71

Extraction Texture Feature c++

I'm trying to extract a feature vector for each pixel of an image by using the gray-values of the surrounding pixels: http://img59.imageshack.us/img59/7398/texturemap.png The pixels marked in black are the pixels used, as the other pixels are redundant to the results of the SVM used later.

At the moment this code is used:

vector<Histogram*> texture_based(image_file* image) {
  int cat;
  Mat img = cvLoadImage(image->getName().c_str(), CV_LOAD_IMAGE_GRAYSCALE);
  Mat img_b(img.rows + 12, img.cols + 12, img.depth());

copyMakeBorder(img, img_b, 6, 6, 6, 6, IPL_BORDER_CONSTANT, cvScalarAll(0));

vector<Histogram*> result;

for(int i = 6; i < img_b.rows - 6; ++i) {
    for(int j = 6; j < img_b.cols - 6; ++j) {
        Mat hist = Mat::zeros(1, 49, CV_32FC1);
        cat = 0;
        hist.at<float>(0, 0) = (float)img_b.at<char>(i - 6, j - 6);
        hist.at<float>(0, 1) = (float)img_b.at<char>(i - 5, j - 5);
        hist.at<float>(0, 2) = (float)img_b.at<char>(i - 4, j - 4);
        hist.at<float>(0, 3) = (float)img_b.at<char>(i - 3, j - 3);
        hist.at<float>(0, 4) = (float)img_b.at<char>(i - 2, j - 2);
        hist.at<float>(0, 5) = (float)img_b.at<char>(i - 1, j - 1);
        hist.at<float>(0, 6) = (float)img_b.at<char>(i, j);
        hist.at<float>(0, 7) = (float)img_b.at<char>(i + 1, j + 1);
        hist.at<float>(0, 8) = (float)img_b.at<char>(i + 2, j + 2);
        hist.at<float>(0, 9) = (float)img_b.at<char>(i + 3, j + 3);
        hist.at<float>(0, 10) = (float)img_b.at<char>(i + 4, j + 4);
        hist.at<float>(0, 11) = (float)img_b.at<char>(i + 5, j + 5);
        hist.at<float>(0, 12) = (float)img_b.at<char>(i + 6, j + 6);
        hist.at<float>(0, 13) = (float)img_b.at<char>(i + 6, j - 6);
        hist.at<float>(0, 14) = (float)img_b.at<char>(i + 5, j - 5);
        hist.at<float>(0, 15) = (float)img_b.at<char>(i + 4, j - 4);
        hist.at<float>(0, 16) = (float)img_b.at<char>(i + 3, j - 3);
        hist.at<float>(0, 17) = (float)img_b.at<char>(i + 2, j - 2);
        hist.at<float>(0, 18) = (float)img_b.at<char>(i + 1, j - 1);
        hist.at<float>(0, 19) = (float)img_b.at<char>(i - 1, j + 1);
        hist.at<float>(0, 20) = (float)img_b.at<char>(i - 2, j + 2);
        hist.at<float>(0, 21) = (float)img_b.at<char>(i - 3, j + 3);
        hist.at<float>(0, 22) = (float)img_b.at<char>(i - 4, j + 4);
        hist.at<float>(0, 23) = (float)img_b.at<char>(i - 5, j + 5);
        hist.at<float>(0, 24) = (float)img_b.at<char>(i - 6, j + 6);
        hist.at<float>(0, 25) = (float)img_b.at<char>(i, j - 6);
        hist.at<float>(0, 26) = (float)img_b.at<char>(i, j - 5);
        hist.at<float>(0, 27) = (float)img_b.at<char>(i, j - 4);
        hist.at<float>(0, 28) = (float)img_b.at<char>(i, j - 3);
        hist.at<float>(0, 29) = (float)img_b.at<char>(i, j - 2);
        hist.at<float>(0, 30) = (float)img_b.at<char>(i, j - 1);
        hist.at<float>(0, 31) = (float)img_b.at<char>(i, j + 1);
        hist.at<float>(0, 32) = (float)img_b.at<char>(i, j + 2);
        hist.at<float>(0, 33) = (float)img_b.at<char>(i, j + 3);
        hist.at<float>(0, 34) = (float)img_b.at<char>(i, j + 4);
        hist.at<float>(0, 35) = (float)img_b.at<char>(i, j + 5);
        hist.at<float>(0, 36) = (float)img_b.at<char>(i, j + 6);
        hist.at<float>(0, 37) = (float)img_b.at<char>(i - 6, j);
        hist.at<float>(0, 38) = (float)img_b.at<char>(i - 5, j);
        hist.at<float>(0, 39) = (float)img_b.at<char>(i - 4, j);
        hist.at<float>(0, 40) = (float)img_b.at<char>(i - 3, j);
        hist.at<float>(0, 41) = (float)img_b.at<char>(i - 2, j);
        hist.at<float>(0, 42) = (float)img_b.at<char>(i - 1, j);
        hist.at<float>(0, 43) = (float)img_b.at<char>(i + 1, j);
        hist.at<float>(0, 44) = (float)img_b.at<char>(i + 2, j);
        hist.at<float>(0, 45) = (float)img_b.at<char>(i + 3, j);
        hist.at<float>(0, 46) = (float)img_b.at<char>(i + 4, j);
        hist.at<float>(0, 47) = (float)img_b.at<char>(i + 5, j);
        hist.at<float>(0, 48) = (float)img_b.at<char>(i + 6, j);
        if(image->inAnyRec(i, j))
            cat = 1;

        Mat_<float> new_hist = hist;
        Histogram* t = new Histogram(&new_hist, cat);
        result.push_back(t);
    }
}

return result;
}

Where image_file* a pointer is to a class with information about the image. I was wondering if there is a faster way of doing this.

Upvotes: 0

Views: 1540

Answers (1)

Aki Suihkonen
Aki Suihkonen

Reputation: 20037

You could calculate the operation in 4 passes; each would initialize a vector of 12 (or 13) elements, move one pixel east, south, northeast or southeast and replace just one pixel from the vector. This would also require initializing all the histogram vectors (width-12)*(height-12), 49 at once.

A supporting option is to rotate/tilt the original image into just four arrays -- you have to profile if it makes sense to perform the char->float conversion at that point.

a b c d   -->  a e i  -->  a f k  >  i f c
e f g h        b f j       b g l     j g d
i j k l        c g k      
               d h l

From these new arrays the memory read pattern / cache locality can make a difference.

Upvotes: 1

Related Questions