用于填充二进制图像的C ++算法

时间:2011-05-09 19:23:48

标签: c++ matlab image-processing flood-fill

我正在尝试模拟一个matlab函数“imfill”来填充二进制图像(1和0的2D矩阵)。

我想在矩阵中指定一个起始点,像imfill的4连接版本那样泛洪填充。

这在C ++世界的某个地方是否已经存在?如果没有,那么最有效的方法是什么?

4 个答案:

答案 0 :(得分:4)

如果您想在C ++中进行图像处理,您必须查看OpenCV(开源计算机视觉)。

这是一个非常棒的图像/视频处理跨平台库,它可以满足您的需求。检查这个问题:

Fill the holes in OpenCV

答案 1 :(得分:3)

如果您的图像只是1和0的2D数组,那么我认为您不需要实际的图形库。

当我过去填写简单的网格时,我只是使用STL队列来存储点列表,然后通过这些点进行处理。队列将从初始点开始,然后我将测试相邻点。如果相邻点需要包含在“flood”中,则将其添加到队列中。有点像这样:

// using this data structure
struct Point {
  int x;
  int y;
};

// 
void fillGrid(Point orig, byte** grid, int width, int height) {
  std::queue<Point> q;
  q.push(orig);

  // the main flood loop
  while(!q.empty()) {
    Point pnt = q.front();
    q.pop();

    // grab adjacent points
    Point adj[4];
    adj[0].x = pnt.x;   adj[0].y = pnt.y-1;   // up
    adj[1].x = pnt.x+1; adj[1].y = pnt.y;     // right
    adj[2].x = pnt.x;   adj[2].y = pnt.y+1;   // down
    adj[3].x = pnt.x-1; adj[3].y = pnt.y;     // left

    for(int i = 0; i < 4; i++) {
      // don't forget boundaries!
      if(adj[i].x < 0 || adj[i].x >= width ||
         adj[i].y < 0 || adj[i].y >= height)
        continue;

      // if adjacent point meets some criteria, then set
      // its value and include it in the queue
      if(includePoint(adj[i], grid)) {
        setPoint(adj[i], grid);
        q.push(adj[i]);
      }
    }
  }
}

答案 2 :(得分:1)

请参阅this page ('QuickFill: An efficient flood fill algorithm')

上的代码示例

在前几个代码示例中,检查像素是否具有填充(或边框)颜色,并且函数对所有四个(或八个)相邻像素递归调用自身(实际上,我声称前几个示例是稍微有点错误,因为第一次递归调用应该是调用一个设置新像素的函数,而不是使用相同的参数再次调用函数本身。)

接下来的几个例子描述了一种递归扫描线方法,它首先在到达相邻线(上下行)之前尽可能地填充(水平)线,因此不太经常访问每个像素。

最后,它建议QuickFill对我来说看起来像是扫描线方法的优化变体。

答案 3 :(得分:0)

Aforge Library具有以下功能

AForge.Imaging.Filters.FillHoles(...)

它与Matlab中的imfill完全相同。