【问题标题】:STL container for simple image segmentation用于简单图像分割的 STL 容器
【发布时间】:2016-12-14 18:15:36
【问题描述】:

我需要根据一个简单的规则(如果值介于 2 个值之间)分割图像。我只使用 STL 容器(我没有使用 opencv 或其他库,因为我想在自学 C++ 的同时保持它不受依赖)

我已将图像存储为vector< vector<double> >。我的蛮力方法是使用 2 个迭代器遍历我的图像并检查每个值,并可能将满足我条件的值的索引推送到另一个 vector<int>。我必须这样做,直到找到所有段。每次我想选择一个段时,我都会遍历存储的索引。

  1. 正确的做法是什么?

  2. 这可以一次性实现吗?

  3. 什么是适合此过程的 STL 容器?我试图 通过这个flowchart 弄清楚。我能想到的最好的 是unordered_multimap

【问题讨论】:

  • 矢量非常适合图像,但通常使用std::vector<double> 效果更好,然后您的索引为vec[currColumn*numRows + currRow]。这样一来,您的图像就在一个连续的、缓存友好的内存中。
  • 很高兴知道,我把它做成 2d 纯粹是为了可读性,没有别的,不知道性能影响。将切换到 1d。
  • 这里的段是什么意思?
  • 类似于opencv python example。每个硬币都是一个片段。

标签: c++ algorithm stl


【解决方案1】:

如果要将元素移动到向量的末尾,请使用std::stable_partition

std::vector<int> vec(20);
// 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 

std::iota(begin(vec), end(vec), 0);
// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 

std::stable_partition(begin(vec), end(vec),
                      [](const auto& e){ return (4 <= e && e < 12);});
// 4 5 6 7 8 9 10 11 0 1 2 3 12 13 14 15 16 17 18 19

Online example here.

如果您将数据存储在单个向量中,这也将起作用 - 将迭代器用于列/行的开头和结尾,而不是整个范围。不过,我不知道您是如何使用 1D 或 2D 向量“跨越”数据的!

(我写了一篇关于Sean Parent's gather algorithm 的非常好的帖子,然后才意识到它没有回答问题。如果您想将选定的项目移动到末端以外的地方,请查看编辑历史记录。)

【讨论】:

    【解决方案2】:

    如果图像被分割成两段,可以将分割存储为vector&lt;vector&lt;bool&gt;&gt;,与图像大小相同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-06
      • 2021-12-31
      • 2017-08-05
      • 2022-10-17
      • 2020-07-19
      • 2013-09-29
      • 2017-07-24
      相关资源
      最近更新 更多