c - 在矩阵中映射相邻子区域并计算每个子区域的质心

标签 c matlab math image-processing signal-processing

我遇到了一个涉及以下内容的问题:

  1. 给定一个具有一些值的 MxN 矩阵。

  2. 给定阈值T

问题

  • 识别矩阵中的子区域。

子区域是矩阵中被视为邻居的单元格区域,并且该子区域中的单元格值大于 T。两个单元格 C1 和 C2 如果相邻,则被视为邻居。如果它们对角相邻,它们也是邻居。

  • 计算每个子区域的“质心”,定义为子区域中细胞的平均位置 (x,y)。每个单元格的位置均按其值进行加权。

我的方法

  1. 搜索 MxN 矩阵以限定单元格并将它们作为节点添加到链表中(它们的值必须大于阈值)。

  2. 从链表中拉出一个节点并将其放入“树”中。该节点将是父节点。根据邻居的定义搜索剩余节点的链表以查找“最近邻居”。每个邻居都作为子节点放置在“树”中。现在..对于每个子节点...搜索剩余节点的链表以找到它们的邻居。继续此操作直至完成。最终的树将代表一个子区域。

  3. 如果链表不为空,则转到 2(并创建一棵新树)

之后,计算每棵树的“质心”就会很容易。

这似乎是正确的方法还是有更好、更优化的方法。

希望得到一些反馈。

谢谢。

编辑

我可能应该提到,矩阵“放置”在 (x,y) 坐标系中,以便左下角单元格(M 行,第 0 列)对应于 (x,y) 坐标 (0, 0) 右上角单元格(第0行第N列)对应(x,y)坐标(N,M)

最佳答案

如果您有图像处理工具箱,则可以使用regionprops来做到这一点.

假设 M 是您的矩阵,T 是阈值:

subregions = regionprops(M > T, 'Centroid');

现在,每个子区域 i 的质心都位于 subregions(i).Centroid 上。

关于c - 在矩阵中映射相邻子区域并计算每个子区域的质心,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23272853/

相关文章:

c++ - 检查 C 和 C++ 中的输出错误

c - 排序后小数点后的数字没有了

arrays - 如何选择矩阵中除索引列表之外的行

matlab - 在 MATLAB 不返回 "inf"的情况下,如何计算 10^400?

Java:我将如何以 45 度或 0 度等以外的角度绘制一条线?

c++ - 如何使用 typedef 为 C++ 数组起别名?

c - 随机字符数组排序

matlab - 如何跟踪给定图片中运动特征的中心点(最好使用MATLAB)?

java - 给定乘数的下一个数字倍数

javascript - 将向量绘制为直线