2013-04-24 122 views
0

我試圖通過使用周圍像素的灰度值爲圖像的每個像素提取特徵向量: http://img59.imageshack.us/img59/7398/texturemap.png 標記爲黑色的像素是使用的像素,因爲其他像素對於稍後使用的SVM的結果是多餘的。提取紋理特徵C++

目前,該代碼使用:

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 *指針是有關圖像信息的類。 我想知道是否有更快的方法做到這一點。

+0

也許嘗試cv :: filter2D()或cv :: bitwise_and()代碼中的某處。 – William 2013-04-24 10:21:24

回答

1

您可以計算4遍的操作;每個將初始化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 

從這些新數組中,內存讀取模式/緩存位置可以有所不同。