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