簡體   English   中英

提取紋理特征c ++

[英]Extraction Texture Feature c++

我試圖通過使用周圍像素的灰度值為圖像的每個像素提取特征向量: http : //img59.imageshack.us/img59/7398/texturemap.png黑色標記的像素是所使用的像素,因為其他像素對於以后使用的SVM結果是多余的。

目前使用此代碼:

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

其中image_file *指向包含有關圖像信息的類的指針。 我想知道是否有更快的方法。

您可以分四遍計算操作; 每個對象都會初始化一個包含12(或13)個元素的向量,向東,向南,東北或東南移動一個像素,並從向量中僅替換一個像素。 這還需要立即初始化所有直方圖矢量(width-12)*(height-12)49。

一個支持的選項是將原始圖像旋轉/傾斜成四個陣列-如果必須在此時執行char-> float轉換,則必須進行剖析。

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

從這些新陣列中,內存讀取模式/緩存位置可能會有所不同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM