我已经存储了图像的二进制直方图。我正在尝试用不同的灰度级别标记不同的连接组件。即不会剩下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];
}
}
}
}
}
感谢任何帮助!