0

画像のバイナリ ヒストグラムを保存しました。さまざまな接続コンポーネントにさまざまなレベルのグレーでラベルを付けようとしています。つまり、レベル 255 は残りません。

動作するコードがいくつかあると思いますが、問題は実行に時間がかかりすぎることです。より速い方法があるかどうか、または問題があるかどうか疑問に思っています。

//first pass

int label = 256;
vector<int> states; 
int cur, top, left;
for(size_t y = 0; y < original_image.rows; y++){
  for(size_t x = 0; x < original_image.cols; x++){
    cur = hist3[y*modified_image.cols + x];
    if(cur == 255){
      top = hist3[(y-1)* modified_image.cols + x];  

      left = hist3[y*modified_image.cols + x - 1];

      if(left > 255 && top <= 255){
        cur = left;
      } else if(top > 255 && left <= 255){
        cur = top;
      } else if(top > 255 && left > 255){
        if(top < left){
          cur = top;
          states.push_back(top);
          states.push_back(left);
        } else if(left < top){
          cur = left;
          states.push_back(left);
          states.push_back(top);
        }
      } else {
        cur = label;
      }
      hist3[y*modified_image.cols + x] = cur;
    } else{
      label++;
    }
  }
}

現在、州では、上と左の間で妥協が必要な領域を 1,2,3,4 として保存し、すべての 2 は 1 で、すべて 4'3 である必要があります。

ここが本当に遅い部分です。うまくいくと思いますが、最高値から始めて作成した状態のリストを調べています。次に、最高値を最低値に変換します。

vector<int> tops;
for(int i = 0; i < states.size(); i++){
  tops.push_back(states[i+1]);
}

sort (tops.begin(), tops.begin()+4); 

for(int i = tops.size() -1; i > 0; i--){
  for(int j = states.size() -1; j > 0; j -= 2){
      if(tops[i] == states[j]){
        for(int p = 0; p < hist3.size(); p++){
          if(hist3[p] == states[j]){
            hist3[p] = states[j-1];
          }
        }
      }
   } 
}

どんな助けにも感謝します!

4

0 に答える 0