У меня есть микроконтроллер STM32H7 с 1 МБ ОЗУ и 1 МБ ПЗУ. Мне нужно сделать алгоритм обнаружения BLOB-объектов на массиве двоичных изображений максимального размера 1280x1024.
Я искал алгоритмы обнаружения BLOB-объектов и обнаружил, что они в основном разделены на 2 категории LINK :
- Алгоритмы, основанные на распространении меток (один компонент за раз) :
Сначала они ищут непомеченный пиксель объекта, помечают пиксель новой меткой; затем при последующей обработке они распространяют одну и ту же метку на все пиксели объекта, которые связаны с пикселем. Демо-код будет выглядеть примерно так:
void setLabels(){
int m=2;
for(int y=0; y<height; y++){
for(int x=0; x<width; x++){
if(getPixel(x,y) == 1) compLabel(x,y,m++);
}
}
}
void compLabel(int i, int j,int m){
if(getPixel(i,j)==1){
setPixel(i,j,m); //assign label
compLabel(i-1,j-1,m);
compLabel(i-1,j,m);
compLabel(i-1,j+1,m);
compLabel(i,j-1,m);
compLabel(i,j+1,m);
compLabel(i+1,j-1,m);
compLabel(i+1,j,m);
compLabel(i+1,j+1,m);
}
}
- Алгоритмы, основанные на эквивалентном разрешении меток (двухпроходном) : они состоят из двух этапов: на первом этапе они присваивают временную метку каждому пикселю объекта. На втором этапе они объединяют все предварительные метки, назначенные каждому объекту, которые называются эквивалентными метками, в уникальную метку, которая называется репрезентативной меткой, и заменяют временную метку каждого пикселя объекта его репрезентативной меткой.
Недостатки 1-го алгоритма в том, что он использует рекурсивные вызовы для всех пикселей вокруг исходного пикселя. Я боюсь, что это приведет к серьезным ошибкам на STM32 из-за ограниченного стека.
Недостатки второго алгоритма в том, что он требует много памяти для маркировки изображения. Например, для макс. разрешение 1280х1024 и для макс. количество меток 255 (0 для метки нет), размер метки изображения составляет 1,25 МБ. Намного больше, чем у нас есть.
Я ищу несколько советов о том, как действовать. Как получить координаты центра и информацию о площади всех пятен на изображении, не используя много памяти? Любая помощь приветствуется. Я предполагаю, что 2-й алгоритм не подходит, так как нет доступной памяти.