【发布时间】:2019-10-09 23:08:27
【问题描述】:
我有一个带有 1MB RAM 和 1MB ROM 的 STM32H7 MCU。我需要对最大尺寸为 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);
}
}
- 基于标签等效解析(两遍)的算法:它们包括两个步骤:在第一步中,它们为每个对象像素分配一个临时标签。第二步,他们将分配给每个对象的所有临时标签(称为等效标签)整合到一个唯一标签(称为代表标签)中,并将每个对象像素的临时标签替换为其代表标签。
第一种算法的缺点是它对原始像素周围的所有像素使用递归调用。由于栈有限,恐怕会在STM32上造成硬故障错误。 第二种算法的缺点是它需要大量内存来标记图像。例如,对于最大值。分辨率为 1280x1024,最大。标签数量 255(0 表示无标签),图像标签大小为 1.25MB。远远超过我们可用的。
我正在寻找一些关于如何进行的建议。如何在不使用太多内存的情况下获取图像中所有斑点的中心坐标和区域信息?任何帮助表示赞赏。我认为第二种算法不适用,因为没有可用的内存。
【问题讨论】:
-
你是如何把这张照片融入你的记忆中的?
binary image array of max size 1280x1024这是否意味着它每个像素只使用一位?因为如果是这样,您已经有 blob。 -
是的,你是对的,每像素单个位 - 0 或 1。但我需要获取每个 blob 的坐标和面积以进行进一步处理。
标签: image embedded processing vision