Обнаружение BLOB-объектов на встроенной платформе, ограничение памяти - PullRequest
0 голосов
/ 23 мая 2019

У меня есть микроконтроллер 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-й алгоритм не подходит, так как нет доступной памяти.

1 Ответ

0 голосов
/ 23 мая 2019

Сначала вы должны просмотреть свое изображение с помощью масштабирующего ядра, чтобы масштабировать его обратно до чего-то, что может быть обработано.4: 1 или 9: 1 - хорошие возможности.Или вам придется получить больше оперативной памяти.Потому что в противном случае ситуация кажется неосуществимой.Битовый доступ не очень быстрый и убьет вашу эффективность, и я даже не думаю, что вам нужен такой большой образ.(по крайней мере, это мой опыт работы с системами зрения)

Затем вы можете хранить пиксели в виде прямого массива unsigned char, который можно пометить первым методом, который вы назвали.Это не должен быть рекурсивный процесс.Вы также можете определить, был ли BLOB-объект связан с другим BLOB-объектом и установить флаг, чтобы сделать это снова.Это позволяет иметь внешне видимую функцию с циклом while, который продолжает вызывать вашу функцию маркировки без создания большого стека.

Затем определение области выполняется путем просмотра изображения и подсчета экземплярапиксель для каждого помеченного шарика.

Центр определенного шарика может быть найден путем вычисления моментов шарика и затем расчета центра масс .Это довольно здоровенная математика, так что не отчаивайтесь, это яблоко, которое можно укусить, но это отличное решение.

(маленький совет: вы можете взять код C ++ из OpenCV и просмотреть их код , чтобы узнать, как это делается)

...