Я сохранил бинарную гистограмму изображения. Я пытаюсь обозначить разные компоненты с разными уровнями серого. Т.е. не останется 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];
}
}
}
}
}
Цени любую помощь!
Задача ещё не решена.
Других решений пока нет …